home *** CD-ROM | disk | FTP | other *** search
/ Amiga Format CD 43 / Amiga Format CD43 (1999)(Future Publishing)(GB)(Track 1 of 2)[!][issue 1999-09].iso / -serious- / graphics / picfx / e-source / picfx.e < prev   
Text File  |  1999-06-15  |  122KB  |  2,856 lines

  1. OPT LARGE
  2. OPT PREPROCESS,OSVERSION=39
  3.  
  4. #define PlaneFuncObject NewObjectA(cl_planefunc.mcc_class,NIL,[TAG_IGNORE,0
  5. #define ProjectListObject NewObjectA(cl_projectlist.mcc_class,NIL,[TAG_IGNORE,0
  6. #define uSliderObject NewObjectA(cl_uslider.mcc_class,NIL,[TAG_IGNORE,0
  7. #define SizeTextObject NewObjectA(cl_sizetxt.mcc_class,NIL,[TAG_IGNORE,0
  8. #define MyApplicationObject NewObjectA(cl_myapp.mcc_class,NIL,[TAG_IGNORE,0
  9.  
  10. #define label(t) TextObject,MUIA_Text_Contents,t,MUIA_Text_SetMax,MUI_TRUE,End
  11.  
  12. #define modt(val) val AND $FF
  13.  
  14. #define PICVERSION 'PicFX alpha 0.88'
  15. #define FULLVERSION '$VER: PicFX alpha 0.88 (22/05/99)'
  16.  
  17. MODULE 'afc/super_picture','afc/trueBitmap'
  18. MODULE       'amigalib/boopsi','amigalib/lists',
  19.        'asl',
  20.        'datatypes','datatypes/datatypes','datatypes/pictureclass','datatypes/pictureclassext','datatypes/datatypesclass',
  21.        'devices/timer',
  22.        'dos/dos','dos/dosextens','dos/dostags',
  23.        'exec/io','exec/lists','exec/memory','exec/nodes','exec/ports','exec/semaphores','exec/tasks',
  24.        'graphics/gfx','graphics/rastport','graphics/view',
  25.            'cybergraphics','picasso96api',
  26.        'intuition/classes','intuition/classusr','intuition/intuition','intuition/screens',
  27.        'libraries/asl','libraries/cybergraphics','libraries/gadtools','libraries/mui',
  28.            'libraries/muip','libraries/picasso96',
  29.        'mui/muicustomclass',
  30.        'muimaster',
  31.        'utility','utility/tagitem',
  32.        '*parser','tools/longreal',
  33.        'mui/lamp_mcc','mui/SettingsWindow_mcc',
  34.        '*picFXlocale'
  35.  
  36. MODULE 'tools/debug' ->kputfmt(formatstring,[values])
  37.  
  38. CONST TICKS_PER_MINUTE = TICKS_PER_SECOND*60
  39.  
  40. DEF app,
  41.     messages_win,messages_lst,
  42.     prefs_win,mainpri_sld,renderpri_sld,renderupdate_sld,mui_btn,
  43.         currpri_sld,close_cyc,
  44.     settings_win,colour_txt,
  45.     opened_lsv,opened_lst,
  46.     new_btn,prefs_btn,
  47.     sgroup, /*settings gadgets*/
  48.     name_str,type_reg,
  49.         path_str,size_rad,size_txt, -> for the DTPic type
  50.         r_lbl,g_lbl,b_lbl,
  51.         red_str,green_str,blue_str,outr_cyc,outg_cyc,outb_cyc, -> for the Function type
  52.         red_fail,green_fail,blue_fail,->comr_cyc,comg_cyc,comb_cyc,
  53.     width_str,height_str,
  54.             /*action buttons*/
  55.     draw_btn,savepic_btn,savefunc_btn,abort_btn,showme_cyc,close_btn,
  56.     loadfunc_btn,clear_btn,
  57.             /*state area*/
  58.     lamp_lmp,state_txt,state_gau,
  59.  
  60.     ftype_registertitles,size_radiolabels,showme_cyclelabels,
  61.     sigs=0,
  62.     lastid=0,/* lastid is a global variable incremented everytime a project is opened.
  63.                 absolutely no risk to have several projects with same ID*/
  64.     screentitle,
  65.     title[15]:STRING,counter=1, -> number of messages
  66.     messages[15]:ARRAY OF LONG,
  67.  
  68.     cat:PTR TO catalog_picFX,
  69.  
  70.     rp=-2,cp=-1,        -> Priorities
  71.     rupd=10,wclose,     -> Render update and Pwindow-close settings
  72. ->    psema:ss,           -> Semaphore for preferences  (!!)
  73.  
  74.     currid=-1,quiet=FALSE     -> currid contains the id of the currently selected project. Quiet controls attributes refreshing.
  75.  
  76. DEF nodraw,friend=NIL
  77.  
  78. ENUM SETID_MainP=1,
  79.      SETID_RenderP,
  80.      SETID_CurrP,
  81.      SETID_RUpd,
  82.      SETID_Close
  83.  
  84. DEF cl_planefunc:PTR TO mui_customclass
  85. DEF cl_projectlist:PTR TO mui_customclass
  86. DEF cl_uslider:PTR TO mui_customclass
  87. DEF cl_sizetxt:PTR TO mui_customclass
  88. DEF cl_myapp:PTR TO mui_customclass
  89.  
  90. /*Registation Number:FCB96172; I take FCB9 as base... :(*/
  91. ENUM MUIA_PlaneFunc_Bstr=$FCB90000, -> String of the B function
  92.      /*MUIA_PlaneFunc_CompileR,       -> Is the red function compiled?
  93.      MUIA_PlaneFunc_CompileG,       -> Is the green function compiled?
  94.      MUIA_PlaneFunc_CompileB,       -> Is the blue function compiled?
  95. */     MUIA_PlaneFunc_Fail,           -> $RGB:How decoding went..
  96.      MUIA_PlaneFunc_Gstr,           -> ..Its string
  97.      MUIA_PlaneFunc_Height,         -> Height of the object
  98.      MUIA_PlaneFunc_ImageFile,      -> FileName of the image to load
  99.      MUIA_PlaneFunc_Left,
  100.      MUIA_PlaneFunc_Loading,        -> TRUE/FALSE
  101.      MUIA_PlaneFunc_LoadM,          -> Way of loading an image, concerning the size
  102.      MUIA_PlaneFunc_Lock,           -> Allows to read/write lock the instance of the class
  103.      MUIA_PlaneFunc_Name,           -> Name of the graph
  104.      MUIA_PlaneFunc_Percent,        -> Percentage of current work done.
  105.      MUIA_PlaneFunc_OutputR,        -> values: OUT_Integer,OUT_Float32 or OUT_Float64,...
  106.      MUIA_PlaneFunc_OutputG,        -> ... or OUT_OldR,OUT_OldG,OUT_OldB,...
  107.      MUIA_PlaneFunc_OutputB,        -> ... or Out_CopyR,OUT_CopyG (!)
  108.      MUIA_PlaneFunc_ProjectID,      -> Used by ProjectList class, it is the ID of the object
  109.      MUIA_PlaneFunc_ProjectNode,    -> Address of the node in the exec_list of opened_lst
  110.      MUIA_PlaneFunc_Quiet,          -> Width/Height changes won't resize the window if non-zero
  111.      MUIA_PlaneFunc_Rstr,           -> Its string
  112.      MUIA_PlaneFunc_State,
  113.      MUIA_PlaneFunc_Top,
  114.      MUIA_PlaneFunc_Type,           -> Type of graph
  115.      MUIA_PlaneFunc_Width           -> Width of the object
  116.  
  117. ENUM MUIM_PlaneFunc_Abort=$FCB90800,-> Aborts Rendering SubTask
  118.      MUIM_PlaneFunc_Clear,          -> Clears bitmap
  119.      MUIM_PlaneFunc_Close,          -> React after a click on the close button.
  120.      MUIM_PlaneFunc_Lamps,          -> This updates the failure lamps of the functions.
  121.      MUIM_PlaneFunc_LoadFunc,       -> Loads a function from disk
  122.      MUIM_PlaneFunc_Render,         -> Launches/pauses the rendering subtask
  123.      MUIM_PlaneFunc_SaveFunc,       -> Saves the function to disk
  124.      MUIM_PlaneFunc_SavePic,        -> Saves the picture to disk, as an ILBM image
  125.      MUIM_PlaneFunc_SetTaskPri,     -> Sets the priority of the subtask
  126.      MUIM_PlaneFunc_Update          -> sent by the subtask, to update the picture display
  127.  
  128. CONST MUIV_PlaneFunc_Type_DTPic=1,
  129.       MUIV_PlaneFunc_Type_Graph=2,
  130.  
  131.       MUIV_PlaneFunc_LoadM_Scale=1,
  132.       MUIV_PlaneFunc_LoadM_CutTile=2,
  133.       MUIV_PlaneFunc_LoadM_ChangeSize=3,
  134.  
  135.       MUIV_PlaneFunc_State_Idle=0,   ->free
  136.       MUIV_PlaneFunc_State_Drawing=1,->busy
  137.       MUIV_PlaneFunc_State_Paused=2, ->busy but paused
  138.       MUIV_PlaneFunc_State_Frozen=3, ->free but being read
  139.       MUIV_PlaneFunc_State_Loading=4,->loading picture
  140.  
  141.       MUIV_PlaneFunc_Lock_Write=-1, -> Want to lock it in write mode, so nobody else may touch the object
  142.       MUIV_PlaneFunc_Lock_NoWrite=0,-> remove writelock
  143.       MUIV_PlaneFunc_Lock_Read=1,   -> Want to lock it in read mode, only reading is now allowed. Nesting counter!
  144.       MUIV_PlaneFunc_Lock_NoRead=0, -> remove one readlock
  145.  
  146.       MUIV_PlaneFunc_Abort_Finish=1,-> Aborted because rendering finished
  147.       MUIV_PlaneFunc_Abort_Abort=2, -> Aborted because user asked
  148.       MUIV_PlaneFunc_Abort_NoLoad=3 -> Aborted because picture could not be loaded
  149.  
  150. ENUM MUIM_ProjectList_DelItem=$FCB91800,-> Closes the current project if possible (i.e. if it isn't read-locked)
  151.      MUIM_ProjectList_Exit,             -> This aborts all currently running projects and quits the application
  152.      MUIM_ProjectList_Forward,          -> Forwards the method (no args!) to the current project
  153.      MUIM_ProjectList_Memory,           -> Shows available memory in title bar.
  154.      MUIM_ProjectList_NewItem,          -> Adds an item in the list
  155.      MUIM_ProjectList_Notify,           -> Sends a notification information to the current project
  156.      MUIM_ProjectList_Prefs,            -> writes a new value in a preference variable
  157.      MUIM_ProjectList_Refresh,          -> Refreshes the user interface according to the select item
  158.      MUIM_ProjectList_SetPri,           -> Set the priority of a task (see MUIV_~)
  159.      MUIM_ProjectList_ShowMe            -> Sets the MUIA_Window_Open of the current project
  160.  
  161. ENUM MUIV_ProjectList_Notify_Name=1,    /*gadget that has been changed*/
  162.      MUIV_ProjectList_Notify_Type,
  163.      MUIV_ProjectList_Notify_ImageFile,
  164.      MUIV_ProjectList_Notify_LoadM,
  165.      MUIV_ProjectList_Notify_Red,
  166.      MUIV_ProjectList_Notify_Green,
  167.      MUIV_ProjectList_Notify_Blue,
  168. /*     MUIV_ProjectList_Notify_CompileR,
  169.      MUIV_ProjectList_Notify_CompileG,
  170.      MUIV_ProjectList_Notify_CompileB,
  171. */     MUIV_ProjectList_Notify_OutputR,
  172.      MUIV_ProjectList_Notify_OutputG,
  173.      MUIV_ProjectList_Notify_OutputB,
  174.      MUIV_ProjectList_Notify_Width,
  175.      MUIV_ProjectList_Notify_Height
  176.  
  177. ENUM MUIV_ProjectList_SetPri_Main=0,
  178.      MUIV_ProjectList_SetPri_Render,
  179.      MUIV_ProjectList_SetPri_Curr
  180.  
  181. CONST MUIA_uSlider_Stringify=$FCB92000
  182.  
  183. ENUM MUIM_uSlider_Bigger=$FCB92800,
  184.      MUIM_uSlider_Smaller
  185.  
  186. ENUM STC_STARTUP=-2,
  187.     STC_SHUTDOWN,      /*messages to the subtask*/
  188.     STC_START,
  189.     STC_PAUSE,
  190.     STC_RESTART,
  191.     STC_CHANGEDONE
  192. /***************************************************************
  193. **            Custom PlaneFunc private Class                  **
  194. ****************************************************************
  195. This class is responsible for rendering the functions. It uses a
  196. subtask to avoid the main program to be freezed during rendering
  197. ***************************************************************/
  198.  
  199. OBJECT empty_data -> class(es) that doesn't use any data
  200.     nothing
  201. ENDOBJECT
  202.  
  203. OBJECT projectList_data
  204.     exec_list:PTR TO lh -> list of the opened projects
  205. /* Stuff for timer (title bar) */
  206. /* Everything is copied from mui demo "inputhandler" Thanks for its authors ;-) */
  207.     port:PTR TO mp
  208.     req:PTR TO timerequest
  209.     ihnode:mui_inputhandlernode_timer
  210. ENDOBJECT
  211.  
  212. OBJECT uslider_data
  213.     buffer:PTR TO CHAR
  214.     stringify
  215. ENDOBJECT
  216.  
  217. OBJECT args_compare -> MUIM_uSlider_Bigger/Smaller
  218.     id
  219.     than
  220. ENDOBJECT
  221.  
  222. OBJECT args_abort -> Used by MUIM_PlaneFunc_Abort
  223.     id
  224.     reason
  225. ENDOBJECT
  226.  
  227. OBJECT args_ctp -> MUIM_PlaneFunc_SetTaskPri
  228.     id
  229.     value
  230. ENDOBJECT
  231.  
  232. OBJECT args_notify -> Used by MUIM_ProjectList_Notify
  233.     id
  234.     gadget -> MUIV_ProjectList_Notify_<something>
  235.     value
  236. ENDOBJECT
  237.  
  238. OBJECT args_showme -> Used by MUIM_ProjectList_ShowMe
  239.     id
  240.     value
  241. ENDOBJECT
  242.  
  243. OBJECT args_forward -> Used by MUIM_ProjectList_Forward
  244.     id
  245.     method
  246. ENDOBJECT
  247.  
  248. OBJECT args_prefs -> MUIM_ProjectList_Prefs
  249.     id
  250.     var:PTR TO LONG
  251.     value
  252. ENDOBJECT
  253.  
  254. OBJECT args_refresh -> Used by MUIM_ProjectList_Refresh
  255.     id
  256.     ostate -> TRUE if only the 'state' field must be refreshed.
  257. ENDOBJECT
  258.  
  259. OBJECT args_setpri -> MUIM_ProjectList_SetPri
  260.     id
  261.     task -> MUIV_ProjectList_SetPri_*
  262.     value
  263. ENDOBJECT
  264.  
  265. PROC planeFunc_dispatcher(cl:PTR TO iclass,obj,msg:PTR TO msg)
  266. DEF methodid
  267.     methodid:=msg.methodid
  268.     SELECT methodid
  269.     CASE OM_NEW;        RETURN planeFunc_new(cl,obj,msg)
  270.     CASE OM_DISPOSE;    RETURN planeFunc_dispose(cl,obj,msg)
  271.     CASE OM_GET;        RETURN planeFunc_get(cl,obj,msg)   /*gets an attribute*/
  272.     CASE OM_SET;        RETURN planeFunc_set(cl,obj,msg)   /*sets an attribute*/
  273.     CASE MUIM_AskMinMax;RETURN planeFunc_askminmax(cl,obj,msg)
  274.     CASE MUIM_Cleanup;  RETURN planeFunc_cleanup(cl,obj,msg)
  275.     CASE MUIM_Draw;     RETURN planeFunc_draw(cl,obj,msg)  /*mui (or the subtask) asked to redraw*/
  276.     CASE MUIM_HandleInput;RETURN planeFunc_handleinput(cl,obj,msg)
  277.     CASE MUIM_Setup;    RETURN planeFunc_setup(cl,obj,msg)
  278.  
  279.     CASE MUIM_PlaneFunc_Abort;      RETURN planeFunc_abort(cl,obj,msg)      /*public methods...*/
  280.     CASE MUIM_PlaneFunc_Clear;      RETURN planeFunc_clear(cl,obj/*,msg*/)
  281.     CASE MUIM_PlaneFunc_Close;      RETURN planeFunc_close(cl,obj/*,msg*/)
  282.     CASE MUIM_PlaneFunc_Lamps;      RETURN planeFunc_lamps(cl,obj/*,msg*/)
  283.     CASE MUIM_PlaneFunc_LoadFunc;   RETURN planeFunc_loadfunc(cl,obj/*,msg*/)
  284.     CASE MUIM_PlaneFunc_Render;     RETURN planeFunc_render(cl,obj/*,msg*/)
  285.     CASE MUIM_PlaneFunc_SaveFunc;   RETURN planeFunc_savefunc(cl,obj/*,msg*/)
  286.     CASE MUIM_PlaneFunc_SavePic;    RETURN planeFunc_savepic(/*cl,obj,msg*/)
  287.     CASE MUIM_PlaneFunc_SetTaskPri; RETURN planeFunc_settaskpri(cl,obj,msg)
  288.     CASE MUIM_PlaneFunc_Update;     RETURN planeFunc_update(cl,obj/*,msg*/)
  289.     ENDSELECT
  290. ENDPROC doSuperMethodA(cl,obj,msg)
  291.  
  292. PROC planeFunc_new(cl:PTR TO iclass,obj:PTR TO object,msg:PTR TO msg)
  293. DEF data:PTR TO planeFunc_data
  294.     IF (obj:=doSuperMethodA(cl,obj,msg))=NIL THEN RETURN 0
  295.     data:=INST_DATA(cl,obj)
  296.  
  297.     data.self:=obj
  298.     data.app:=app
  299.     InitSemaphore(data.sema)
  300.     NEW data.rp
  301.     InitRastPort(data.rp)
  302.  
  303.     data.projectid:=lastid++
  304.     data.failure:=$000
  305.     data.rstr:=String(256)
  306.     data.gstr:=String(256)
  307.     data.bstr:=String(256)
  308.     StrCopy(data.rstr,'x')
  309.     StrCopy(data.gstr,'y')
  310.     StrCopy(data.bstr,'(x+y)/2')
  311.     data.outputr:=OUT_Integer
  312.     data.outputg:=OUT_Integer
  313.     data.outputb:=OUT_Integer
  314.     NEW data.rfunc.create(data.outputr,data.rstr)
  315.     NEW data.gfunc.create(data.outputg,data.gstr)
  316.     NEW data.bfunc.create(data.outputb,data.bstr)
  317.     data.imagefile:=String(256)
  318.  
  319.     data.height:=256
  320.     StrCopy(data.imagefile,cat.msg_Unnamed.getstr())
  321.     data.loadm:=MUIV_PlaneFunc_LoadM_CutTile
  322.     data.lock:=0
  323.     data.name:=String(32)
  324.     StrCopy(data.name,cat.msg_Unnamed.getstr())
  325.     data.paused:=FALSE
  326.     data.type:=MUIV_PlaneFunc_Type_Graph
  327.     data.width:=256
  328.  
  329.     data.xmin:=10
  330.     data.xmax:=240
  331.     data.ymin:=30
  332.     data.ymax:=80
  333.  
  334.     IF cybergfxbase
  335.         data.rp.bitmap:= AllocBitMap(data.width,data.height,24,BMF_MINPLANES OR BMF_CLEAR,NIL)
  336.     ELSE
  337.         data.rp.bitmap:= Pi96AllocBitMap(data.width,data.height,24,BMF_MINPLANES OR BMF_CLEAR,NIL,RGBFB_A8R8G8B8)
  338.     ENDIF
  339.     IF (data.rp.bitmap)
  340.         RETURN obj -> If everything got ok
  341.     ENDIF
  342.     coerceMethodA(cl,obj,OM_DISPOSE) -> In case of failure
  343. ENDPROC
  344. PROC planeFunc_askminmax(cl:PTR TO iclass,obj:PTR TO object,msg:PTR TO muip_askminmax)
  345. DEF minmax:PTR TO mui_minmax,data:PTR TO planeFunc_data
  346.     data:=INST_DATA(cl,obj)
  347.     doSuperMethodA(cl,obj,msg)
  348.     minmax:=msg.minmaxinfo
  349.     minmax.maxwidth:=minmax.maxwidth+data.width
  350.     minmax.maxheight:=minmax.maxheight+data.height
  351.     minmax.defwidth:=minmax.defwidth+(data.width)
  352.     minmax.defheight:=minmax.defheight+(data.height)
  353. ENDPROC 0
  354.  
  355. PROC planeFunc_setup(cl:PTR TO iclass,obj:PTR TO object,msg:PTR TO msg)
  356.     IF doSuperMethodA(cl,obj,msg)=NIL THEN RETURN FALSE
  357.     Mui_RequestIDCMP(obj,IDCMP_MOUSEBUTTONS)
  358.     ->Mui_RequestIDCMP(obj,IDCMP_RAWKEY)
  359. ENDPROC MUI_TRUE
  360.  
  361. PROC planeFunc_cleanup(cl:PTR TO iclass,obj:PTR TO object,msg:PTR TO msg)
  362.     Mui_RejectIDCMP(obj,IDCMP_MOUSEBUTTONS)
  363.     ->Mui_RejectIDCMP(obj,IDCMP_RAWKEY)
  364. ENDPROC doSuperMethodA(cl,obj,msg)
  365.  
  366. PROC planeFunc_handleinput(cl:PTR TO iclass,obj:PTR TO object,msg:PTR TO muip_handleinput)
  367. #define _between(a,x,b) (((x)>=(a)) AND ((x)<=(b)))
  368. DEF data:PTR TO planeFunc_data,col,colourstr[30]:STRING,x,y
  369.  
  370.     data:=INST_DATA(cl,obj)
  371.     IF msg.imsg
  372.         IF (msg.imsg.class=IDCMP_MOUSEBUTTONS) AND (msg.imsg.code=SELECTDOWN)
  373.             IF (_between(_mleft(obj),msg.imsg.mousex,_mright(obj)) AND _between(_mtop(obj),msg.imsg.mousey,_bottom(obj)))
  374.                 x:=msg.imsg.mousex-_mleft(obj)+data.left
  375.                 y:=msg.imsg.mousey-_mtop(obj)+data.top
  376.                 /*get colour*/
  377.                 ObtainSemaphore(data.sema)
  378.                 IF cybergfxbase
  379.                     col:=ReadRGBPixel(data.rp,x,y)
  380.                 ELSE
  381.                     col:=Pi96ReadPixel(data.rp,x,y)
  382.                 ENDIF
  383.                 ReleaseSemaphore(data.sema)
  384.                 StringF(colourstr,'c(\d,\d,\d)=[\d,\d,\d]',data.projectid,x,y,Shr(col,16),Shr(col AND $FF00,8),col AND $FF)
  385.                 set(colour_txt,MUIA_Text_Contents,colourstr)
  386.             ENDIF
  387. /*        ELSEIF (msg.imsg.class=IDCMP_RAWKEY)
  388.             IF (msg.imsg.code=96) OR (msg.imsg.code=97)
  389.                 data.shift:=TRUE
  390.             ELSEIF (msg.imsg.code=224) OR (msg.imsg.code=225)
  391.                 data.shift:=FALSE
  392.             ENDIF*/
  393.         ENDIF
  394.     ENDIF
  395. ENDPROC doSuperMethodA(cl,obj,msg)
  396.  
  397. PROC planeFunc_clear(cl:PTR TO iclass,obj:PTR TO object/*,msg:PTR TO msg*/)
  398. DEF data:PTR TO planeFunc_data
  399.     data:=INST_DATA(cl,obj)
  400.     ObtainSemaphore(data.sema)
  401.     IF data.lock=0
  402.         SetRast(data.rp,1)
  403.         ReleaseSemaphore(data.sema)
  404.         Mui_Redraw(obj,MADF_DRAWOBJECT)
  405.     ELSE
  406.         ReleaseSemaphore(data.sema)
  407.         message(data.projectid,cat.msgm_WriteVsLock.getstr())
  408.     ENDIF
  409. ENDPROC
  410.  
  411. PROC planeFunc_close(cl:PTR TO iclass,obj:PTR TO object/*,msg:PTR TO msg*/)
  412. DEF data:PTR TO planeFunc_data,kdata:PTR TO projectList_data
  413. DEF state,node:PTR TO project_Node,count=0,exec_list:PTR TO lh
  414.     data:=INST_DATA(cl,obj)
  415.     IF wclose=0
  416.         IF data.projectid=currid
  417.             nnset(showme_cyc,MUIA_Cycle_Active,0) -> update cycle display.
  418.         ENDIF
  419.         set(data.projectnode.window,MUIA_Window_Open,FALSE)
  420.     ELSEIF wclose=1
  421. quiet:=TRUE
  422. IF currid=data.projectid THEN currid:=-1
  423.         kdata:=INST_DATA(cl_projectlist.mcc_class,opened_lst)
  424.         doMethodA(obj,[MUIM_PlaneFunc_Abort,MUIV_PlaneFunc_Abort_Abort])
  425.         get(obj,MUIA_PlaneFunc_State,{state})
  426.         IF state = MUIV_PlaneFunc_State_Frozen
  427.             message(data.projectid,cat.msgm_RemVsFreeze.getstr())
  428.             quiet:=FALSE
  429.             RETURN
  430.         ENDIF
  431.  
  432.         exec_list:=kdata.exec_list
  433.         node:=exec_list.head
  434.         WHILE node.pid <> data.projectid
  435.             count++
  436.             node:=node.ln.succ
  437.         ENDWHILE
  438.         get(obj,MUIA_PlaneFunc_ProjectNode,{state})
  439.         doMethodA(opened_lst,[MUIM_List_Remove,count])
  440.         DisposeLink(node.item)
  441.         set(node.window,MUIA_Window_Open,FALSE)
  442.         doMethodA(app,[OM_REMMEMBER,node.window])
  443.         Mui_DisposeObject(node.window)
  444.         Remove(node)
  445.         END node
  446. quiet:=FALSE
  447.         doMethodA(opened_lst,[MUIM_ProjectList_Refresh,0])
  448.     ENDIF
  449. ENDPROC
  450.  
  451. PROC planeFunc_dispose(cl:PTR TO iclass,obj:PTR TO object,msg:PTR TO msg)
  452. DEF data:PTR TO planeFunc_data
  453.     data:=INST_DATA(cl,obj)
  454.     ObtainSemaphore(data.sema)
  455.     data.app:=NIL
  456.     ReleaseSemaphore(data.sema)
  457.     IF data.subtask
  458.         killsubtask(data.subtask)
  459.         IF data.type = MUIV_PlaneFunc_Type_Graph
  460.             free(data.rfunc)
  461.             free(data.gfunc)
  462.             free(data.bfunc)
  463.         ENDIF
  464.     ENDIF
  465.     IF cybergfxbase
  466.         IF (data.rp.bitmap) THEN FreeBitMap(data.rp.bitmap)
  467.     ELSE
  468.         IF (data.rp.bitmap) THEN Pi96FreeBitMap(data.rp.bitmap)
  469.     ENDIF
  470.     END data.rp
  471.     DisposeLink(data.name)
  472.     DisposeLink(data.rstr)
  473.     DisposeLink(data.gstr)
  474.     DisposeLink(data.bstr)
  475.     END data.rfunc
  476.     END data.gfunc
  477.     END data.bfunc
  478.     DisposeLink(data.imagefile)
  479. ENDPROC doSuperMethodA(cl,obj,msg)
  480. PROC planeFunc_lamps(cl:PTR TO iclass,obj:PTR TO object/*,msg:PTR TO msg*/)
  481. DEF data:PTR TO planeFunc_data
  482.     data:=INST_DATA(cl,obj)
  483.     IF data.failure AND $1
  484.         set(blue_fail,MUIA_Lamp_Color,MUIV_Lamp_Color_Error)
  485.     ELSE
  486.         set(blue_fail,MUIA_Lamp_Color,MUIV_Lamp_Color_Ok)
  487.     ENDIF
  488.     data:=INST_DATA(cl,obj)
  489.     IF data.failure AND $10
  490.         set(green_fail,MUIA_Lamp_Color,MUIV_Lamp_Color_Error)
  491.     ELSE
  492.         set(green_fail,MUIA_Lamp_Color,MUIV_Lamp_Color_Ok)
  493.     ENDIF
  494.     IF data.failure AND $100
  495.         set(red_fail,MUIA_Lamp_Color,MUIV_Lamp_Color_Error)
  496.     ELSE
  497.         set(red_fail,MUIA_Lamp_Color,MUIV_Lamp_Color_Ok)
  498.     ENDIF
  499. ENDPROC
  500.  
  501. PROC planeFunc_draw(cl:PTR TO iclass,obj:PTR TO object,msg:PTR TO muip_draw)
  502. DEF data:PTR TO planeFunc_data,utop,delta
  503. /*
  504. MovePixelArray(srcx,srcy,rp,dstx,dsty,wid,hei) -> (wid×hei) is the size of the rectangle to be moved!
  505. ScrollRaster(rp,dltx,dlty,xmin,ymin,xmax,ymax) -> (rectangle) is the rectangle where scroll will occur!
  506. */
  507.     doSuperMethodA(cl,obj,msg)
  508.     IF nodraw THEN RETURN
  509.     data:=INST_DATA(cl,obj)
  510.     IF (msg.flags AND MADF_DRAWUPDATE)
  511.         IF data.newtop <> 0/*scroll vertically*/
  512.             ObtainSemaphore(data.sema)
  513.             IF data.newtop < data.top  /*1)scroll upwards*/
  514.                 delta:=data.top-data.newtop
  515.                 IF delta < _mheight(obj)
  516.                     IF pi96base
  517.                         ScrollRaster(_rp(obj),0,-delta,_mleft(obj),_mtop(obj),_mleft(obj)+_mwidth(obj),_mtop(obj)+_mheight(obj))
  518.                     ELSE
  519.                         MovePixelArray(_mleft(obj),_mtop(obj),_rp(obj),_mleft(obj),_mtop(obj)+delta,_mwidth(obj),_mheight(obj)-delta)
  520.                     ENDIF
  521.                 ELSE
  522.                     delta:=_mheight(obj)
  523.                 ENDIF
  524.                 BltBitMapRastPort(data.rp.bitmap,data.left,data.newtop,_rp(obj),_mleft(obj),_mtop(obj),_mwidth(obj),delta,$c0)
  525.             ELSE        /*2)data.newtop > data.top => scroll downwards*/
  526.                 delta:=data.newtop-data.top
  527.                 IF delta < _mheight(obj)
  528.                     IF pi96base
  529.                         ScrollRaster(_rp(obj),0,delta,_mleft(obj),_mtop(obj),_mleft(obj)+_mwidth(obj),_mtop(obj)+_mheight(obj))
  530.                     ELSE
  531.                         MovePixelArray(_mleft(obj),_mtop(obj)+delta,_rp(obj),_mleft(obj),_mtop(obj),_mwidth(obj),_mheight(obj)-delta)
  532.                     ENDIF
  533.                 ELSE
  534.                     delta:=_mheight(obj)
  535.                 ENDIF
  536.                 BltBitMapRastPort(data.rp.bitmap,data.left,data.top+_mheight(obj),_rp(obj),_mleft(obj),_mbottom(obj)-delta+1,_mwidth(obj),delta,$c0)
  537.             ENDIF
  538.             ReleaseSemaphore(data.sema)
  539.             data.top:=data.newtop
  540.             data.newtop:=0
  541.         ENDIF
  542.         IF data.newleft <> 0/*scroll horizontally*/
  543.             ObtainSemaphore(data.sema)
  544.             IF data.newleft < data.left  /*3)scroll leftwards*/
  545.                 delta:=data.left-data.newleft
  546.                 IF delta < _mwidth(obj)
  547.                     IF pi96base
  548.                         ScrollRaster(_rp(obj),-delta,0,_mleft(obj),_mtop(obj),_mleft(obj)+_mwidth(obj),_mtop(obj)+_mheight(obj))
  549.                     ELSE
  550.                         MovePixelArray(_mleft(obj),_mtop(obj),_rp(obj),_mleft(obj)+delta,_mtop(obj),_mwidth(obj)-delta,_mheight(obj))
  551.                     ENDIF
  552.                 ELSE
  553.                     delta:=_mwidth(obj)
  554.                 ENDIF
  555.                 BltBitMapRastPort(data.rp.bitmap,data.newleft,data.top,_rp(obj),_mleft(obj),_mtop(obj),delta,_mheight(obj),$c0)
  556.             ELSE        /*4)data.newleft > data.left => scroll rightwards*/
  557.                 delta:=data.newleft-data.left
  558.                 IF delta < _mwidth(obj)
  559.                     IF pi96base
  560.                         ScrollRaster(_rp(obj),delta,0,_mleft(obj),_mtop(obj),_mleft(obj)+_mwidth(obj),_mtop(obj)+_mheight(obj))
  561.                     ELSE
  562.                         MovePixelArray(_mleft(obj)+delta,_mtop(obj),_rp(obj),_mleft(obj),_mtop(obj),_mwidth(obj)-delta,_mheight(obj))
  563.                     ENDIF
  564.                 ELSE
  565.                     delta :=_mwidth(obj)
  566.                 ENDIF
  567.                 BltBitMapRastPort(data.rp.bitmap,data.left+_mwidth(obj),data.top,_rp(obj),_mright(obj)-delta+1,_mtop(obj),delta,_mheight(obj),$c0)
  568.             ENDIF
  569.             ReleaseSemaphore(data.sema)
  570.             data.left:=data.newleft
  571.             data.newleft:=0
  572.         ENDIF
  573.         IF data.drawn < data.calculated
  574.             utop:=data.drawn+1  /*5) Update display*/
  575.             delta:=data.calculated-data.drawn            /*I don't think that the semaphore is required here, only the lines that are already been*/
  576.             IF delta > 0                                /*calculated will be drawn and data.calculated is accessed only once.*/
  577.                 IF (utop < (data.top+_mheight(obj))) AND (utop+delta > data.top)
  578.                     IF utop < data.top
  579.                         delta:=delta-data.top+utop
  580.                         utop:=data.top
  581.                     ELSEIF (utop+delta) > (data.top+_mheight(obj))
  582.                         delta:=data.top+_mheight(obj)-utop
  583.                     ENDIF
  584.                     BltBitMapRastPort(data.rp.bitmap,data.left,utop,_rp(obj),_mleft(obj),_mtop(obj)+utop-data.top,_mwidth(obj),delta,$c0)
  585.                 ENDIF
  586.             ENDIF
  587.             data.drawn:=data.calculated
  588.         ENDIF
  589.     ELSEIF (msg.flags AND MADF_DRAWOBJECT)
  590.         /*the window may have been resized..*/
  591.         ObtainSemaphore(data.sema)
  592.         set(data.hscroll,MUIA_Prop_Visible,_mwidth(obj))
  593.         set(data.vscroll,MUIA_Prop_Visible,_mheight(obj))
  594.         get(data.vscroll,MUIA_Prop_First,{delta})
  595.         data.top:=delta
  596.         get(data.hscroll,MUIA_Prop_First,{delta})
  597.         data.left:=delta
  598.         BltBitMapRastPort(data.rp.bitmap,data.left,data.top,_rp(obj),_mleft(obj),_mtop(obj),_mwidth(obj),_mheight(obj),$c0)
  599.         data.drawn:=data.calculated
  600.         ReleaseSemaphore(data.sema)
  601.  
  602.         /*SetAPen(_rp(obj),_dri(obj).pens[TEXTPEN])
  603.         data.xmin:=data.xmin-1
  604.         data.xmax:=data.xmax+2
  605.         data.ymin:=data.ymin-1
  606.         data.ymax:=data.ymax+2
  607.         IF data.ymin > data.top              /*top border*/
  608.             Move(_rp(obj),_mleft(obj)+Max(0,data.xmin-data.left),         _mtop(obj)+data.ymin-data.top)
  609.             Draw(_rp(obj),_mleft(obj)+Min(_mwidth(obj),data.xmax-data.left),_mtop(obj)+data.ymin-data.top)
  610.         ENDIF
  611.         IF data.xmax < data.left+_mwidth(obj)/*right border*/
  612.             Move(_rp(obj),_mleft(obj)+data.xmax-data.left,                _mtop(obj)+Max(0,data.ymin-data.top))
  613.             Draw(_rp(obj),_mleft(obj)+data.xmax-data.left,                _mtop(obj)+Min(_mheight(obj),data.ymax-data.top))
  614.         ENDIF
  615.         IF data.ymax < data.top+_mheight(obj)/*bottom border*/
  616.             Move(_rp(obj),_mleft(obj)+Min(_mwidth(obj),data.xmax-data.left),_mtop(obj)+data.ymax-data.top)
  617.             Draw(_rp(obj),_mleft(obj)+Max(0,data.xmin-data.left),         _mtop(obj)+data.ymax-data.top)
  618.         ENDIF
  619.         IF data.xmin > data.left             /*left border*/
  620.             Move(_rp(obj),_mleft(obj)+data.xmin-data.left,                _mtop(obj)+Min(_mheight(obj),data.ymax-data.top))
  621.             Draw(_rp(obj),_mleft(obj)+data.xmin-data.left,                _mtop(obj)+Max(0,data.ymin-data.top))
  622.         ENDIF
  623.  
  624.         SetAPen(_rp(obj),_dri(obj).pens[SHINEPEN])
  625.         data.xmin:=data.xmin-1
  626.         data.xmax:=data.xmax-1
  627.         data.ymin:=data.ymin-1
  628.         data.ymax:=data.ymax-1
  629.         IF data.ymin > data.top              /*top border*/
  630.             Move(_rp(obj),_mleft(obj)+Max(0,data.xmin-data.left),         _mtop(obj)+data.ymin-data.top)
  631.             Draw(_rp(obj),_mleft(obj)+Min(_mwidth(obj),data.xmax-data.left),_mtop(obj)+data.ymin-data.top)
  632.         ENDIF
  633.         IF data.xmax < data.left+_mwidth(obj)/*right border*/
  634.             Move(_rp(obj),_mleft(obj)+data.xmax-data.left,                _mtop(obj)+Max(0,data.ymin-data.top))
  635.             Draw(_rp(obj),_mleft(obj)+data.xmax-data.left,                _mtop(obj)+Min(_mheight(obj),data.ymax-data.top))
  636.         ENDIF
  637.         IF data.ymax < data.top+_mheight(obj)/*bottom border*/
  638.             Move(_rp(obj),_mleft(obj)+Min(_mwidth(obj),data.xmax-data.left),_mtop(obj)+data.ymax-data.top)
  639.             Draw(_rp(obj),_mleft(obj)+Max(0,data.xmin-data.left),         _mtop(obj)+data.ymax-data.top)
  640.         ENDIF
  641.         IF data.xmin > data.left            /*left border*/
  642.             Move(_rp(obj),_mleft(obj)+data.xmin-data.left,                _mtop(obj)+Min(_mheight(obj),data.ymax-data.top))
  643.             Draw(_rp(obj),_mleft(obj)+data.xmin-data.left,                _mtop(obj)+Max(0,data.ymin-data.top))
  644.         ENDIF
  645.         data.xmin:=data.xmin+2
  646.         data.xmax:=data.xmax-1
  647.         data.ymin:=data.ymin+2
  648.         data.ymax:=data.ymax-1  */
  649.     ENDIF
  650. ENDPROC
  651.  
  652. /*not yet finished: ability to select a destination area*/
  653.  
  654. /*PROC drawhoriz(x,y,xx,obj:PTR TO object,data:PTR TO planeFunc_data)
  655.     IF data.ymin > data.top              /*top border*/
  656.         Move(_rp(obj),_mleft(obj)+Max(0,data.xmin-data.left),         _mtop(obj)+data.ymin-data.top)
  657.         Draw(_rp(obj),_mleft(obj)+Min(_mwidth(obj),data.xmax-data.left),_mtop(obj)+data.ymin-data.top)
  658.     ENDIF
  659.  
  660.     Move(_rp(obj),x,y)
  661.     Draw(_rp(obj),xx,y)
  662. ENDPROC*/
  663.  
  664. PROC planeFunc_get(cl:PTR TO iclass,obj:PTR TO object,msg:PTR TO opget)
  665. DEF data:PTR TO planeFunc_data,storage,attrid
  666.  
  667.     data:=INST_DATA(cl,obj)
  668.     attrid:=msg.attrid
  669.     storage:=msg.storage
  670.     ObtainSemaphore(data.sema)
  671.     SELECT attrid
  672.     CASE MUIA_PlaneFunc_Bstr
  673.         ^storage:=data.bstr
  674. /*    CASE MUIA_CompileR
  675.         ^storage:=data.compiler
  676.     CASE MUIA_CompileG
  677.         ^storage:=data.compileg
  678.     CASE MUIA_CompileB
  679.         ^storage:=data.compileb
  680. */    CASE MUIA_PlaneFunc_Gstr
  681.         ^storage:=data.gstr
  682.     CASE MUIA_PlaneFunc_Height
  683.         ^storage:=data.height
  684.     CASE MUIA_PlaneFunc_ImageFile
  685.         ^storage:=data.imagefile
  686.     CASE MUIA_PlaneFunc_Loading
  687.         ^storage:=data.loading
  688.     CASE MUIA_PlaneFunc_LoadM
  689.         ^storage:=data.loadm
  690.     CASE MUIA_PlaneFunc_Lock
  691.         ^storage:=data.lock
  692.     CASE MUIA_PlaneFunc_Name
  693.         ^storage:=data.name
  694.     CASE MUIA_PlaneFunc_Percent
  695.         IF data.lock=MUIV_PlaneFunc_Lock_Write
  696.             ^storage:=data.calculated*100/data.height
  697.         ELSE
  698.             ^storage:=0
  699.         ENDIF
  700.     CASE MUIA_PlaneFunc_OutputR
  701.         ^storage:=data.outputr
  702.     CASE MUIA_PlaneFunc_OutputG
  703.         ^storage:=data.outputg
  704.     CASE MUIA_PlaneFunc_OutputB
  705.         ^storage:=data.outputb
  706.     CASE MUIA_PlaneFunc_ProjectID
  707.         ^storage:=data.projectid
  708.     CASE MUIA_PlaneFunc_ProjectNode
  709.         ^storage:=data.projectnode
  710.     CASE MUIA_PlaneFunc_Quiet
  711.         ^storage:=data.quiet
  712.     CASE MUIA_PlaneFunc_Rstr
  713.         ^storage:=data.rstr
  714.     CASE MUIA_PlaneFunc_State
  715.         IF data.lock = MUIV_PlaneFunc_Lock_Write
  716.             IF data.paused
  717.                 ^storage:=MUIV_PlaneFunc_State_Paused
  718.             ELSEIF data.loading
  719.                 ^storage:=MUIV_PlaneFunc_State_Loading
  720.             ELSE
  721.                 ^storage:=MUIV_PlaneFunc_State_Drawing
  722.             ENDIF
  723.         ELSE
  724.             IF data.lock = 0
  725.                 ^storage:=MUIV_PlaneFunc_State_Idle
  726.             ELSE
  727.                 ^storage:=MUIV_PlaneFunc_State_Frozen
  728.             ENDIF
  729.         ENDIF
  730.     CASE MUIA_PlaneFunc_Type
  731.         ^storage:=data.type
  732.     CASE MUIA_PlaneFunc_Width
  733.         ^storage:=data.width
  734.     DEFAULT
  735.         ReleaseSemaphore(data.sema)
  736.         RETURN doSuperMethodA(cl,obj,msg)
  737.     ENDSELECT
  738.     ReleaseSemaphore(data.sema)
  739. ENDPROC MUI_TRUE
  740.  
  741. PROC planeFunc_set(cl:PTR TO iclass,obj:PTR TO object,msg:PTR TO opset)
  742. DEF data:PTR TO planeFunc_data,
  743.     tags:PTR TO tagitem,
  744.     tag:PTR TO tagitem,
  745.     attrid
  746. DEF window,group
  747.  
  748.     data:=INST_DATA(cl,obj)
  749.     tags:=msg.attrlist
  750.     ObtainSemaphore(data.sema)
  751.     WHILE tag:=NextTagItem({tags})
  752.         attrid:=tag.tag
  753.         SELECT attrid
  754.         CASE MUIA_PlaneFunc_ImageFile
  755.             StrCopy(data.imagefile,tag.data)
  756.         CASE MUIA_PlaneFunc_Loading
  757.             data.loading:=tag.data
  758.             IF data.projectid=currid THEN
  759.                 setlamp(obj)
  760.         CASE MUIA_PlaneFunc_Left
  761.             data.newleft:=tag.data
  762.             Mui_Redraw(obj,MADF_DRAWUPDATE)
  763.         CASE MUIA_PlaneFunc_ProjectNode
  764.             data.projectnode:=tag.data
  765.         CASE MUIA_PlaneFunc_Top
  766.             data.newtop:=tag.data
  767.             Mui_Redraw(obj,MADF_DRAWUPDATE)
  768.         CASE MUIA_PlaneFunc_Lock
  769.             IF data.lock=MUIV_PlaneFunc_Lock_Write-> If the object is being written, the only tag allowed is NoWrite
  770.                 IF tag.data=MUIV_PlaneFunc_Lock_NoWrite
  771.                     data.lock:=0
  772.                 ENDIF
  773.             ELSEIF data.lock=0            -> If the object is free, it can either be read or write - locked
  774.                 data.lock:=tag.data
  775.             ELSE                         -> If the object is read locked, it can be read unlocked or read locked again.
  776.                 IF tag.data=MUIV_PlaneFunc_Lock_NoRead
  777.                     data.lock:=data.lock-1
  778.                 ELSEIF tag.data=MUIV_PlaneFunc_Lock_Read
  779.                     data.lock:=data.lock+1
  780.                 ENDIF
  781.             ENDIF
  782.             doMethodA(opened_lst,[MUIM_ProjectList_Refresh,data.projectid+2]) -> Refresh the "state" lamp.
  783.         CASE MUIA_PlaneFunc_Name
  784.             StrCopy(data.name,tag.data)
  785.             get(obj,MUIA_WindowObject,{window})
  786.             set(window,MUIA_Window_Title,data.name)
  787.         CASE MUIA_PlaneFunc_Quiet
  788.             data.quiet:=tag.data
  789.             IF data.quiet=FALSE
  790.                 get(obj,MUIA_Parent,{group})
  791.                 doMethodA(group,[MUIM_Group_InitChange])
  792.                 doMethodA(group,[MUIM_Group_ExitChange])
  793.                 IF cybergfxbase
  794.                     IF (data.rp.bitmap) THEN FreeBitMap(data.rp.bitmap)
  795.                     data.rp.bitmap:= AllocBitMap(data.width,data.height,24,BMF_MINPLANES OR BMF_CLEAR,friend)
  796.                 ELSE
  797.                     IF (data.rp.bitmap) THEN Pi96FreeBitMap(data.rp.bitmap)
  798.                     data.rp.bitmap:= Pi96AllocBitMap(data.width,data.height,24,BMF_MINPLANES OR BMF_CLEAR,NIL,RGBFB_A8R8G8B8)
  799.                 ENDIF
  800.                 IF data.projectid=currid
  801.                     nnset(width_str,MUIA_String_Integer,data.width)
  802.                     nnset(height_str,MUIA_String_Integer,data.height)
  803.                 ENDIF
  804.                 IF data.subtask THEN
  805.                     sendsubtaskmsg(data.subtask,STC_CHANGEDONE,NIL)
  806.             ENDIF
  807.         DEFAULT
  808.             IF (data.lock <> MUIV_PlaneFunc_Lock_Write) OR (data.quiet=-2)
  809.                 SELECT attrid
  810.                 CASE MUIA_PlaneFunc_Bstr
  811.                     StrCopy(data.bstr,tag.data)
  812.                     LowerStr(data.bstr)
  813.                     idecode(data.bfunc,tag.data,$1,data)
  814. /*                CASE MUIA_PlaneFunc_CompileR -> No need to react, as both the code and the description of function are saved.
  815.                     data.compiler:=tag.data
  816.                 CASE MUIA_PlaneFunc_CompileG
  817.                     data.compiler:=tag.data
  818.                 CASE MUIA_PlaneFunc_CompileB
  819.                     data.compiler:=tag.data
  820. */                CASE MUIA_PlaneFunc_Gstr
  821.                     StrCopy(data.gstr,tag.data)
  822.                     idecode(data.gfunc,tag.data,$10,data)
  823.                 CASE MUIA_PlaneFunc_LoadM
  824.                     data.loadm:=tag.data
  825.                 CASE MUIA_PlaneFunc_OutputR
  826.                     data.outputr:=tag.data
  827.                     idecode(data.rfunc,data.rstr,$100,data,data.outputr)
  828.                 CASE MUIA_PlaneFunc_OutputG
  829.                     data.outputg:=tag.data
  830.                     idecode(data.gfunc,data.gstr,$10,data,data.outputg)
  831.                 CASE MUIA_PlaneFunc_OutputB
  832.                     data.outputb:=tag.data
  833.                     idecode(data.bfunc,data.bstr,$1,data,data.outputb)
  834.                 CASE MUIA_PlaneFunc_Rstr
  835.                     StrCopy(data.rstr,tag.data)
  836.                     LowerStr(data.rstr)
  837.                     idecode(data.rfunc,tag.data,$100,data)
  838.                 CASE MUIA_PlaneFunc_Type
  839.                     data.type:=tag.data
  840.                 DEFAULT
  841.                     IF (data.lock <> MUIV_PlaneFunc_Lock_NoRead) AND (data.quiet<>-2)
  842.                         message(data.projectid,cat.msgm_AttrVsLock.getstr())
  843.                     ELSEIF attrid = MUIA_PlaneFunc_Width
  844.                         data.width:=tag.data
  845.                         set(data.hscroll,MUIA_Prop_Entries,tag.data)
  846.                         IF data.quiet=FALSE
  847.                             get(obj,MUIA_Parent,{group})
  848.                             doMethodA(group,[MUIM_Group_InitChange])
  849.                             doMethodA(group,[MUIM_Group_ExitChange])
  850.                             IF cybergfxbase
  851.                                 IF (data.rp.bitmap) THEN FreeBitMap(data.rp.bitmap)
  852.                                 data.rp.bitmap:= AllocBitMap(data.width,data.height,24,BMF_MINPLANES OR BMF_CLEAR,friend)
  853.                             ELSE
  854.                                 IF (data.rp.bitmap) THEN Pi96FreeBitMap(data.rp.bitmap)
  855.                                 data.rp.bitmap:= Pi96AllocBitMap(data.width,data.height,24,BMF_MINPLANES OR BMF_CLEAR,NIL,RGBFB_A8R8G8B8)
  856.                             ENDIF
  857.                         ENDIF
  858.                     ELSEIF attrid = MUIA_PlaneFunc_Height
  859.                         data.height:=tag.data
  860.                         set(data.vscroll,MUIA_Prop_Entries,tag.data)
  861.                         IF data.quiet=FALSE
  862.                             get(obj,MUIA_Parent,{group})
  863.                             doMethodA(group,[MUIM_Group_InitChange])
  864.                             doMethodA(group,[MUIM_Group_ExitChange])
  865.                             IF cybergfxbase
  866.                             IF (data.rp.bitmap) THEN FreeBitMap(data.rp.bitmap)
  867.                                 data.rp.bitmap:= AllocBitMap(data.width,data.height,24,BMF_MINPLANES OR BMF_CLEAR,friend)
  868.                             ELSE
  869.                                 IF (data.rp.bitmap) THEN Pi96FreeBitMap(data.rp.bitmap)
  870.                                 data.rp.bitmap:= Pi96AllocBitMap(data.width,data.height,24,BMF_MINPLANES OR BMF_CLEAR,NIL,RGBFB_A8R8G8B8)
  871.                             ENDIF
  872.                         ENDIF
  873.                     ENDIF
  874.                 ENDSELECT
  875.             ELSE
  876.                 message(data.projectid,cat.msgm_AttrVsLock.getstr())
  877.             ENDIF
  878.         ENDSELECT
  879.     ENDWHILE
  880.     ReleaseSemaphore(data.sema)
  881. ENDPROC doSuperMethodA(cl,obj,msg)
  882.  
  883. /*idecode, extends f.create(). Ok, I know I should maybe have written a method, but it's easier like this :-¦*/
  884. PROC idecode(f:PTR TO expression,s:PTR TO CHAR,l,data:PTR TO planeFunc_data,in=-1)
  885. DEF out/*:PTR TO outinfo,err*/,i:PTR TO CHAR
  886.  
  887.     i:=String(StrLen(s)) -> New string so that lowerstr doesn't change text in field.
  888.     StrCopy(i,s)
  889.     LowerStr(i)
  890.  
  891.     IF in = -1 THEN
  892.         in:=f.precision
  893.  
  894.     IF in = OUT_Float64
  895.         message(data.projectid,cat.msgm_Nof64.getstr())
  896.         DisposeLink(i)
  897.         RETURN
  898.     ENDIF
  899.  
  900.     END f
  901.  
  902.     NEW f.create(in,i)
  903.     out:=f.message
  904.     IF out AND FAILURE
  905.         data.failure:=data.failure OR l
  906.         /*err:=out.error
  907.         SELECT err
  908.         CASE ERR_NoParse
  909.             messagefmt(data.projectid,cat.msgm_NoParse.getstr(),out.quote)
  910.         CASE ERR_NoFunc
  911.             messagefmt(data.projectid,cat.msgm_NoFunc.getstr(),out.quote)
  912.         CASE ERR_NoChar
  913.             messagefmt(data.projectid,cat.msgm_NoChar.getstr(),out.quote)
  914.         DEFAULT
  915.             message(data.projectid,cat.msgm_Failure.getstr())
  916.         ENDSELECT
  917.         END out*/
  918.     ELSE -> Can't currently have both failure and warning. It will come :-)
  919.         data.failure:=data.failure AND Not(l)
  920.         IF out AND WARN_NoSupport THEN
  921.             message(data.projectid,cat.msgm_WarnNoSupport.getstr())
  922.         IF out AND WARN_EPi THEN
  923.             message(data.projectid,cat.msgm_WarnEPi.getstr())
  924.     ENDIF
  925.     doMethodA(data.self,[MUIM_PlaneFunc_Lamps])
  926.     DisposeLink(i)
  927. ENDPROC
  928.  
  929. PROC planeFunc_abort(cl:PTR TO iclass,obj:PTR TO object,msg:PTR TO args_abort)
  930. DEF data:PTR TO planeFunc_data,ds1:PTR TO datestamp,ds2:datestamp,qe[30]:STRING,u
  931.     data:=INST_DATA(cl,obj)
  932.     IF data.subtask
  933.         killsubtask(data.subtask)
  934.         data.subtask:=NIL
  935.         set(obj,MUIA_PlaneFunc_Lock,MUIV_PlaneFunc_Lock_NoWrite)
  936.         IF data.type = MUIV_PlaneFunc_Type_Graph
  937.             free(data.rfunc)
  938.             free(data.gfunc)
  939.             free(data.bfunc)
  940.         ENDIF
  941.         u:=msg.reason
  942.         SELECT u
  943.         CASE MUIV_PlaneFunc_Abort_Finish
  944.             ds1:=data.ds
  945.             DateStamp(ds2)
  946.             u:=(ds2.minute-ds1.minute)*TICKS_PER_MINUTE+ds2.tick-ds1.tick -> number of ticks
  947.             StringF(qe,'\s  \z\d[2]:\z\d[2].\z\d[2].',cat.msgm_Done.getstr(),u/TICKS_PER_MINUTE,Mod(u,TICKS_PER_MINUTE)/TICKS_PER_SECOND,Mod(u,TICKS_PER_SECOND)*100/TICKS_PER_SECOND)
  948.             message(data.projectid,qe)
  949.         CASE MUIV_PlaneFunc_Abort_Abort
  950.             message(data.projectid,cat.msgm_Abort.getstr())
  951.         CASE MUIV_PlaneFunc_Abort_NoLoad
  952.             message(data.projectid,cat.msgm_NoLoad.getstr())
  953.         ENDSELECT
  954.  
  955.         data.drawn:=0
  956.         data.calculated:=0
  957.         data.paused:=FALSE
  958.     ENDIF
  959. ENDPROC
  960.  
  961. PROC planeFunc_loadfunc(cl:PTR TO iclass,obj:PTR TO object/*,msg:PTR TO msg*/)
  962. DEF u,filereq:PTR TO filerequester,s[200]:STRING,handler,data:PTR TO planeFunc_data,
  963.     eq,var[10]:STRING,value:PTR TO CHAR
  964.  
  965.     data:=INST_DATA(cl,obj)
  966.     get(settings_win,MUIA_Window_Window,{u})
  967.     filereq:=AllocAslRequest(ASL_FILEREQUEST,
  968.                             [ASL_HAIL,      cat.msgr_Loadf_T.getstr(),
  969.                              ASL_OKTEXT,    cat.msgr_Loadf_Ok.getstr(),
  970.                              ASL_DIR,       'progdir:Functions/',
  971.                              ASL_WINDOW,    u,
  972.                              NIL])
  973.     IF filereq=NIL
  974.         Mui_RequestA(app,settings_win,0,cat.msgr_Loadf_T.getstr(),NIL,cat.msgr_NoAslReq.getstr(),NIL)
  975.     ELSE
  976.         IF AslRequest(filereq,NIL)
  977.             StrCopy(s,filereq.drawer)
  978.             AddPart(s,filereq.file,StrMax(s))
  979.             SetStr(s,StrLen(s))
  980.         ENDIF
  981.         FreeAslRequest(filereq)
  982.     ENDIF
  983.     IF s[] = NIL THEN RETURN
  984.     handler:=Open(s,OLDFILE)
  985.     Fgets(handler,s,StrMax(s)-1)
  986.     IF s[]=NIL
  987.         Close(handler)
  988.         message(data.projectid,cat.msgm_EmptyFile.getstr())
  989.         RETURN
  990.     ENDIF
  991.     SetStr(s,StrLen(s)-1)
  992.     IF Not(StrCmp(s,'picFX function-file; type1'))
  993.         Close(handler)
  994.         message(data.projectid,cat.msgm_BadFile.getstr())
  995.         RETURN
  996.     ENDIF
  997.     set(obj,MUIA_PlaneFunc_Quiet,MUI_TRUE)
  998.     WHILE Fgets(handler,s,StrMax(s)-1)/* semaphore will be obtained in the SET method */
  999.         SetStr(s,StrLen(s)-1)
  1000.         eq:=InStr(s,'=')
  1001.         StrCopy(var,s,eq)
  1002.         value:=s+eq+1
  1003.         IF StrCmp(var,'bstr')
  1004.             set(obj,MUIA_PlaneFunc_Bstr,value)
  1005.         ELSEIF StrCmp(var,'gstr')
  1006.             set(obj,MUIA_PlaneFunc_Gstr,value)
  1007.         ELSEIF StrCmp(var,'height')
  1008.             set(obj,MUIA_PlaneFunc_Height,Val(value))
  1009.         ELSEIF StrCmp(var,'rstr')
  1010.             set(obj,MUIA_PlaneFunc_Rstr,value)
  1011.         ELSEIF StrCmp(var,'width')
  1012.             set(obj,MUIA_PlaneFunc_Width,Val(value))
  1013.         ELSEIF StrCmp(var,'precision') -> Obsolete tag!
  1014.             set(obj,MUIA_PlaneFunc_OutputR,Val(value))
  1015.             set(obj,MUIA_PlaneFunc_OutputG,Val(value))
  1016.             set(obj,MUIA_PlaneFunc_OutputB,Val(value))
  1017.             message(data.projectid,'Warning, obsolete tag "precision" used!')
  1018.         ELSEIF StrCmp(var,'outputr')
  1019.             set(obj,MUIA_PlaneFunc_OutputR,Val(value))
  1020.         ELSEIF StrCmp(var,'outputg')
  1021.             set(obj,MUIA_PlaneFunc_OutputG,Val(value))
  1022.         ELSEIF StrCmp(var,'outputb')
  1023.             set(obj,MUIA_PlaneFunc_OutputB,Val(value))
  1024.         ELSE
  1025.             StringF(s,cat.msgm_UnknownVar.getstr(),var)
  1026.             message(data.projectid,s)
  1027.         ENDIF
  1028.     ENDWHILE
  1029.     Close(handler)
  1030.     set(obj,MUIA_PlaneFunc_Quiet,FALSE)
  1031.     doMethodA(opened_lst,[MUIM_ProjectList_Refresh,0])
  1032. ENDPROC
  1033.  
  1034. PROC planeFunc_render(cl:PTR TO iclass,obj:PTR TO object/*,msg*/)
  1035. DEF data:PTR TO planeFunc_data,state
  1036.     data:=INST_DATA(cl,obj)
  1037.     get(obj,MUIA_PlaneFunc_State,{state})
  1038.     SELECT state
  1039.     CASE MUIV_PlaneFunc_State_Idle
  1040.         IF data.type = MUIV_PlaneFunc_Type_DTPic
  1041.             set(obj,MUIA_PlaneFunc_Loading,TRUE)
  1042.             set(obj,MUIA_PlaneFunc_Lock,MUIV_PlaneFunc_Lock_Write)
  1043.  
  1044.             data.rupd:=rupd
  1045.  
  1046.             /* the following call starts the sub task */
  1047.             data.subtask:= spawnsubtask('PicFX-Render-Task',{loadpicture},data)
  1048.             IF (data.subtask)
  1049.                 SetTaskPri(data.subtask.st_Task,cp)
  1050.                 sendsubtaskmsg(data.subtask,STC_START,NIL)
  1051.             ENDIF
  1052.         ELSE
  1053.             set(obj,MUIA_PlaneFunc_Lock,MUIV_PlaneFunc_Lock_Write)
  1054.             IF freeze(data.rfunc) = 0 -> This will freeze used projects; if zero, it failed.
  1055.                 message(data.projectid,cat.msgm_NoAlloc.getstr())
  1056.                 set(obj,MUIA_PlaneFunc_Lock,MUIV_PlaneFunc_Lock_NoWrite)
  1057.                 RETURN
  1058.             ENDIF
  1059.             IF freeze(data.gfunc) = 0
  1060.                 message(data.projectid,cat.msgm_NoAlloc.getstr())
  1061.                 set(obj,MUIA_PlaneFunc_Lock,MUIV_PlaneFunc_Lock_NoWrite)
  1062.                 RETURN
  1063.             ENDIF
  1064.             IF freeze(data.bfunc) = 0
  1065.                 message(data.projectid,cat.msgm_NoAlloc.getstr())
  1066.                 set(obj,MUIA_PlaneFunc_Lock,MUIV_PlaneFunc_Lock_NoWrite)
  1067.                 RETURN
  1068.             ENDIF
  1069.             /*will we have to save previous pixel information?*/
  1070.             data.savepixel:=(data.outputr>=OUT_OldR) AND (data.outputr<=OUT_OldB)
  1071.             data.savepixel:=data.savepixel OR ((data.outputg>=OUT_OldR) AND (data.outputg<=OUT_OldB))
  1072.             data.savepixel:=data.savepixel OR ((data.outputb>=OUT_OldR) AND (data.outputb<=OUT_OldB))
  1073.  
  1074.             data.rupd:=rupd
  1075.  
  1076.             data.subtask:= spawnsubtask('PicFX-Render-Task',{renderfunc},data)
  1077.             IF (data.subtask)
  1078.                 SetTaskPri(data.subtask.st_Task,cp)
  1079.                 sendsubtaskmsg(data.subtask,STC_START,NIL)
  1080.             ENDIF
  1081.         ENDIF
  1082.     CASE MUIV_PlaneFunc_State_Drawing
  1083.         sendsubtaskmsg(data.subtask,STC_PAUSE,NIL)
  1084.         data.paused:=TRUE
  1085.         doMethodA(opened_lst,[MUIM_ProjectList_Refresh,data.projectid+2])
  1086.     CASE MUIV_PlaneFunc_State_Paused
  1087.         data.paused:=FALSE
  1088.         sendsubtaskmsg(data.subtask,STC_RESTART,NIL)
  1089.         doMethodA(opened_lst,[MUIM_ProjectList_Refresh,data.projectid+2])
  1090.     CASE MUIV_PlaneFunc_State_Frozen
  1091.         message(data.projectid,cat.msgm_WriteVsFreeze.getstr())
  1092.     ENDSELECT
  1093. ENDPROC
  1094.  
  1095. PROC planeFunc_savefunc(cl:PTR TO iclass,obj:PTR TO object/*,msg:PTR TO msg*/)
  1096. DEF u,filereq:PTR TO filerequester,s[200]:STRING,newhandler,oldhandler,data:PTR TO planeFunc_data
  1097.     data:=INST_DATA(cl,obj)
  1098.     get(settings_win,MUIA_Window_Window,{u})
  1099.     filereq:=AllocAslRequest(ASL_FILEREQUEST,
  1100.                             [ASL_HAIL,      cat.msgr_Savef_T.getstr(),
  1101.                              ASL_OKTEXT,    cat.msgr_Savef_Ok.getstr(),
  1102.                              ASL_DIR,       'progdir:Functions/',
  1103.                              ASL_WINDOW,    u,
  1104.                              ASL_FUNCFLAGS, FILF_SAVE,
  1105.                              NIL])
  1106.     IF filereq=NIL
  1107.         Mui_RequestA(app,settings_win,0,cat.msgr_Savef_T.getstr(),NIL,cat.msgr_NoAslReq.getstr(),NIL)
  1108.     ELSE
  1109.         IF AslRequest(filereq,NIL)
  1110.             StrCopy(s,filereq.drawer)
  1111.             AddPart(s,filereq.file,StrMax(s))
  1112.             SetStr(s,StrLen(s))
  1113.         ENDIF
  1114.         FreeAslRequest(filereq)
  1115.     ENDIF
  1116.     IF s[] = NIL THEN RETURN
  1117.     newhandler:=Open(s,NEWFILE)
  1118.     oldhandler:=SetStdOut(newhandler)
  1119.     WriteF('picFX function-file; type1\n')
  1120.     ObtainSemaphore(data.sema)
  1121.     WriteF('bstr=\s\n',data.bstr)
  1122.     WriteF('gstr=\s\n',data.gstr)
  1123.     WriteF('height=\d\n',data.height)
  1124.     WriteF('rstr=\s\n',data.rstr)
  1125.     WriteF('outputr=\d\n',data.outputr)
  1126.     WriteF('outputg=\d\n',data.outputg)
  1127.     WriteF('outputb=\d\n',data.outputb)
  1128.     WriteF('width=\d\n',data.width)
  1129.     ReleaseSemaphore(data.sema)
  1130.     Close(newhandler)
  1131.     SetStdOut(oldhandler)
  1132. ENDPROC
  1133.  
  1134. PROC planeFunc_savepic(/*cl:PTR TO iclass,obj:PTR TO object,msg:PTR TO args_file*/)
  1135. ENDPROC
  1136.  
  1137. PROC planeFunc_settaskpri(cl:PTR TO iclass,obj:PTR TO object,msg:PTR TO args_ctp)
  1138. DEF data:PTR TO planeFunc_data
  1139.     data:=INST_DATA(cl,obj)
  1140.     ObtainSemaphore(data.sema)
  1141.     IF data.subtask THEN
  1142.         SetTaskPri(data.subtask.st_Task,msg.value)
  1143.     ReleaseSemaphore(data.sema)
  1144. ENDPROC
  1145. PROC planeFunc_update(cl:PTR TO iclass,obj:PTR TO object/*,msg:PTR TO msg*/)
  1146. DEF data:PTR TO planeFunc_data
  1147.     data:=INST_DATA(cl,obj)
  1148.     ObtainSemaphore(data.sema)
  1149.     data.app:=NIL
  1150.     ReleaseSemaphore(data.sema)
  1151.     Mui_Redraw(obj,MADF_DRAWUPDATE)
  1152.     IF data.projectid = currid
  1153. ->        ObtainSemaphore(data.sema)
  1154.         set(state_gau,MUIA_Gauge_Current,data.calculated*100/data.height)
  1155. ->        ReleaseSemaphore(data.sema)
  1156.     ENDIF
  1157.     ObtainSemaphore(data.sema)
  1158.     data.app:=app
  1159.     ReleaseSemaphore(data.sema)
  1160. ENDPROC
  1161.  
  1162. /***************************************************************
  1163. ** custom ProjectList private subclass of List class          **
  1164. ****************************************************************
  1165. **                                                            **
  1166. ** Interaction between the application and the opened projects**
  1167. ***************************************************************/
  1168.  
  1169. CONST PROJECTNODE_ID=100
  1170.  
  1171. PROC projectList_dispatcher(cl:PTR TO iclass,obj:PTR TO object,msg:PTR TO msg)
  1172. DEF methodid
  1173.     methodid:=msg.methodid
  1174.     SELECT methodid
  1175.     CASE OM_NEW                   ; RETURN projectList_new(cl,obj,msg)
  1176.     CASE OM_DISPOSE               ; RETURN projectList_dispose(cl,obj,msg)
  1177.     CASE MUIM_Setup               ; RETURN projectList_setup(cl,obj,msg)
  1178.     CASE MUIM_Cleanup             ; RETURN projectList_cleanup(cl,obj,msg)
  1179.     CASE MUIM_ProjectList_DelItem ; RETURN projectList_delitem(cl,obj/*,msg*/)
  1180.     CASE MUIM_ProjectList_Exit    ; RETURN projectList_exit(cl,obj/*,msg*/)
  1181.     CASE MUIM_ProjectList_Forward ; RETURN projectList_forward(cl,obj,msg)
  1182.     CASE MUIM_ProjectList_Memory  ; RETURN projectList_memory(cl,obj/*,msg*/)
  1183.     CASE MUIM_ProjectList_NewItem ; RETURN projectList_newitem(cl,obj/*,msg*/)
  1184.     CASE MUIM_ProjectList_Notify  ; RETURN projectList_notify(cl,obj,msg)
  1185.     CASE MUIM_ProjectList_Prefs   ; RETURN projectList_prefs(/*cl,obj,*/msg)
  1186.     CASE MUIM_ProjectList_Refresh ; RETURN projectList_refresh(cl,obj,msg)
  1187.     CASE MUIM_ProjectList_SetPri  ; RETURN projectList_setpri(cl,obj,msg)
  1188.     CASE MUIM_ProjectList_ShowMe  ; RETURN projectList_showme(cl,obj,msg)
  1189.     ENDSELECT
  1190. ENDPROC doSuperMethodA(cl,obj,msg)
  1191.  
  1192. PROC getcurrent(data:PTR TO projectList_data,obj:PTR TO object)
  1193. DEF active
  1194. DEF exec_list:PTR TO lh,worknode:PTR TO project_Node,z,list:PTR TO mlh,cs:PTR TO object
  1195.     get(obj,MUIA_List_Active,{active})
  1196.     IF active=MUIV_List_Active_Off THEN RETURN 0
  1197.     exec_list:=data.exec_list
  1198.     worknode:=exec_list.head
  1199.               /* I should add here a check that the bound of the list is never reached!*/
  1200.     IF active > 0
  1201.         FOR z:=1 TO active
  1202.             worknode:=worknode.ln.succ
  1203.         ENDFOR
  1204.     ENDIF
  1205.     get(worknode.window,MUIA_Window_RootObject,{z})
  1206.  
  1207.     get(z,MUIA_Group_ChildList,{list})
  1208.     cs:=list.head
  1209. ENDPROC NextObject({cs}),worknode.window
  1210.  
  1211. /*Care! getp() asks the ProjectID and not line number!!!*/
  1212.  
  1213. PROC getp(data:PTR TO projectList_data,pid)
  1214. DEF exec_list:PTR TO lh,worknode:PTR TO project_Node,z,list:PTR TO mlh,cs:PTR TO object
  1215.  
  1216.     exec_list:=data.exec_list
  1217.     worknode:=exec_list.head
  1218.               /* I should add here a check that the bound of the list is never reached!*/
  1219.     WHILE mcomp(worknode,pid)
  1220.         worknode:=worknode.ln.succ
  1221.     ENDWHILE
  1222.     IF worknode.ln.succ = 0
  1223.         z:=String(80)
  1224.         StringF(z,cat.msgm_NoID.getstr(),pid)
  1225.         message(-1,z)
  1226.         DisposeLink(z)
  1227.         RETURN 0,0
  1228.     ENDIF
  1229.     get(worknode.window,MUIA_Window_RootObject,{z})
  1230.  
  1231.     get(z,MUIA_Group_ChildList,{list})
  1232.     cs:=list.head
  1233. ENDPROC NextObject({cs}),worknode.window
  1234.  
  1235. PROC mcomp(node:PTR TO project_Node,id)
  1236.     IF node.ln.succ=0 THEN RETURN FALSE -> This silly proc to avoid a atupid enforcer hit :-s
  1237. ENDPROC (node.pid <> id)
  1238.  
  1239. PROC getdata(data:PTR TO projectList_data,pid)
  1240. DEF gad
  1241.     gad:=getp(data,pid)
  1242.     IF gad = 0 THEN RETURN 0
  1243. ENDPROC INST_DATA(cl_planefunc.mcc_class,gad)
  1244.  
  1245. PROC projectList_new(cl:PTR TO iclass,obj:PTR TO object,msg:PTR TO msg)
  1246. DEF exec_list:PTR TO lh,data:PTR TO projectList_data
  1247. DEF port,req
  1248.     IF (obj:=doSuperMethodA(cl,obj,msg)) = FALSE THEN RETURN FALSE
  1249.     data:=INST_DATA(cl,obj)
  1250.     NEW exec_list
  1251.     newList(exec_list) -> Create an Exec list for the opened projects
  1252.     data.exec_list:=exec_list -> save the list in the instance data
  1253.  
  1254.     screentitle:=String(150)
  1255.  
  1256.     port := CreateMsgPort() -> Check here that port exists
  1257.     data.port:=port
  1258.     req := CreateIORequest(data.port,SIZEOF timerequest) -> Check here that req exists
  1259.     data.req:=req
  1260.     OpenDevice(TIMERNAME,UNIT_VBLANK,data.req,0) -> NIL if it went all right, check it
  1261.     data.ihnode.ihn_millis  := 5000 -> Update memory display every five seconds
  1262.     data.ihnode.ihn_object  := obj
  1263.     data.ihnode.ihn_method  := MUIM_ProjectList_Memory
  1264.     data.ihnode.ihn_flags   := MUIIHNF_TIMER
  1265. ENDPROC obj
  1266.  
  1267. PROC projectList_setup(cl:PTR TO iclass,obj:PTR TO object,msg:PTR TO muip_setup)
  1268. DEF id,data:PTR TO projectList_data
  1269.     IF doSuperMethodA(cl,obj,msg) = FALSE THEN RETURN FALSE
  1270.     data:=INST_DATA(cl,obj)
  1271.     IF (msg.renderinfo.mri_flags AND MUIMRI_TRUECOLOR) = 0
  1272.         message(-1,cat.msgm_NoCgx.getstr())
  1273.         message(-1,cat.msgm_NoDraw.getstr())
  1274.         nodraw:=MUI_TRUE
  1275.     ELSEIF nodraw=MUI_TRUE
  1276.         nodraw:=FALSE
  1277.         message(-1,cat.msgm_CgxOk.getstr())
  1278.         message(-1,cat.msgm_DrawOk.getstr())
  1279.     ENDIF
  1280.     id:=GetVPModeID(msg.renderinfo.mri_screen.viewport) AND $FFF00000
  1281.         /*This is only due to my observation, that first three
  1282.          quartets "seem" to be constant for a given monitor*/
  1283.  
  1284.     SELECT id
  1285.     CASE $40d00000 /*cgx*/  /* what about IsCyberModeID() ? */
  1286.         IF pi96base
  1287.             CloseLibrary(pi96base)
  1288.             pi96base:=0
  1289.         ENDIF
  1290.         IF Not(cybergfxbase) THEN cybergfxbase:=OpenLibrary('cybergraphics.library',0)
  1291.         IF cybergfxbase=0
  1292.             messagefmt(-1,cat.msg_Nolib.getstr(), 'cybergraphics.library')
  1293.         ELSE
  1294.             messagefmt(-1,cat.msgm_useDriver.getstr(),'Cybergraph''x')
  1295.         ENDIF
  1296.     CASE $50000000 /*p96*/
  1297.         IF cybergfxbase
  1298.             CloseLibrary(cybergfxbase)
  1299.             cybergfxbase:=0
  1300.         ENDIF
  1301.         IF Not(pi96base) THEN pi96base:=OpenLibrary('Picasso96API.library',0)
  1302.         IF pi96base=0
  1303.             messagefmt(-1,cat.msg_Nolib.getstr(),'Picasso96API.library')
  1304.         ELSE
  1305.             messagefmt(-1,cat.msgm_useDriver.getstr(),'Picasso96')
  1306.         ENDIF
  1307.     CASE $00000000 /*aga*/
  1308.         IF cybergfxbase
  1309.             CloseLibrary(cybergfxbase)
  1310.             cybergfxbase:=0
  1311.         ENDIF
  1312.         IF pi96base
  1313.             CloseLibrary(pi96base)
  1314.             pi96base:=0
  1315.         ENDIF
  1316.         message(-1,cat.msgm_AgaSorry1.getstr())
  1317.         message(-1,cat.msgm_AgaSorry2.getstr())
  1318.     DEFAULT
  1319.         message(-1,cat.msgm_UnknownMode.getstr())
  1320.         IF cybergfxbase
  1321.             CloseLibrary(cybergfxbase)
  1322.             cybergfxbase:=0
  1323.         ENDIF
  1324.         IF pi96base
  1325.             CloseLibrary(pi96base)
  1326.             pi96base:=0
  1327.         ENDIF
  1328.     ENDSELECT
  1329.  
  1330.     data.req.io.command := TR_ADDREQUEST
  1331.     data.req.time.secs    := 5 -> Update every five seconds
  1332.     data.req.time.micro   := 0
  1333.     SendIO(data.req)
  1334.     doMethodA(_app(obj),[MUIM_Application_AddInputHandler,data.ihnode])
  1335.  
  1336.     initfuncs({getdata},data,pi96base) -> initialization of parser.m
  1337.  
  1338. ENDPROC MUI_TRUE
  1339.  
  1340. PROC projectList_cleanup(cl:PTR TO iclass,obj:PTR TO object,msg:PTR TO msg)
  1341. DEF data:PTR TO projectList_data
  1342.     data := INST_DATA(cl,obj)
  1343.     doMethodA(_app(obj),[MUIM_Application_RemInputHandler,data.ihnode])
  1344.     IF (CheckIO(data.req)=NIL) THEN AbortIO(data.req)
  1345.     WaitIO(data.req)
  1346. ENDPROC (doSuperMethodA(cl,obj,msg))
  1347.  
  1348. PROC projectList_dispose(cl:PTR TO iclass,obj:PTR TO object,msg:PTR TO msg)
  1349. DEF worknode:PTR TO project_Node, nextnode,exec_list:PTR TO lh,data:PTR TO projectList_data
  1350.     data:=INST_DATA(cl,obj)
  1351.     exec_list:=data.exec_list
  1352.     worknode:=exec_list.head  -> First node
  1353.     IF worknode
  1354.         WHILE nextnode:=worknode.ln.succ
  1355.             END worknode;worknode:=nextnode
  1356.         ENDWHILE
  1357.     ENDIF
  1358.  
  1359.     DisposeLink(screentitle)
  1360.  
  1361.     IF (data.req)
  1362.         IF (data.req.io.device) THEN CloseDevice(data.req)
  1363.         DeleteIORequest(data.req)
  1364.     ENDIF
  1365.     IF (data.port) THEN DeleteMsgPort(data.port)
  1366. ENDPROC doSuperMethodA(cl,obj,msg)
  1367.  
  1368. PROC projectList_delitem(cl:PTR TO iclass,obj:PTR TO object/*,msg:PTR TO msg*/)
  1369. DEF data:PTR TO projectList_data,gad,window,state,
  1370.   node:PTR TO project_Node
  1371.  
  1372. quiet:=TRUE /*prevents the opened projects list from refreshing the display*/
  1373.     data:=INST_DATA(cl,obj)
  1374.     gad,window:=getcurrent(data,obj)
  1375.     doMethodA(gad,[MUIM_PlaneFunc_Abort,MUIV_PlaneFunc_Abort_Abort])/*aborts the task, if necessary*/
  1376.     get(gad,MUIA_PlaneFunc_ProjectNode,{node})
  1377.     get(gad,MUIA_PlaneFunc_State,{state})
  1378.     IF state = MUIV_PlaneFunc_State_Frozen
  1379.         message(node.pid,cat.msgm_RemVsFreeze.getstr())
  1380.         RETURN
  1381.     ENDIF
  1382.     doMethodA(obj,[MUIM_List_Remove,MUIV_List_Remove_Active])/*removes the name from the list*/
  1383.     DisposeLink(node.item)
  1384.     set(window,MUIA_Window_Open,FALSE)/*Closes the window*/
  1385.     doMethodA(app,[OM_REMMEMBER,window])
  1386.     Mui_DisposeObject(window) /*Removes the window and the PlaneFuncObject*/
  1387.     Remove(node)
  1388.     END node
  1389.     currid:=-1 -> This is to prevent projectList to change that unexistant project's priority
  1390. quiet:=FALSE
  1391.     doMethodA(obj,[MUIM_ProjectList_Refresh,0])
  1392. ENDPROC
  1393.  
  1394. PROC projectList_exit(cl:PTR TO iclass,obj:PTR TO object/*,msg:PTR TO msg*/)
  1395. DEF gad,data:PTR TO projectList_data,str[40]:STRING,pid
  1396. DEF exec_list:PTR TO lh,worknode:PTR TO project_Node,z,list:PTR TO mlh,cs:PTR TO object
  1397.     ->WriteF('Executing exit method...\n')
  1398.     data:=INST_DATA(cl,obj)
  1399.     exec_list:=data.exec_list
  1400.     worknode:=exec_list.head
  1401.     WHILE worknode.ln.succ
  1402.         get(worknode.window,MUIA_Window_RootObject,{z})
  1403.         get(z,MUIA_Group_ChildList,{list})
  1404.         cs:=list.head
  1405.         gad:=NextObject({cs})
  1406.         get(gad,MUIA_PlaneFunc_ProjectID,{pid})
  1407.         StringF(str,cat.msgm_Removing.getstr(),pid)
  1408.         message(-1,str)
  1409.         doMethodA(gad,[MUIM_PlaneFunc_Abort,MUIV_PlaneFunc_Abort_Abort])
  1410.         worknode:=worknode.ln.succ
  1411.     ENDWHILE
  1412. ENDPROC
  1413.  
  1414. PROC projectList_forward(cl:PTR TO iclass,obj:PTR TO object,msg:PTR TO args_forward)
  1415. DEF gad,data:PTR TO projectList_data
  1416.     data:=INST_DATA(cl,obj)
  1417.     gad:=getcurrent(data,obj)
  1418.     IF msg.method=MUIM_PlaneFunc_Abort
  1419.         doMethodA(gad,[MUIM_PlaneFunc_Abort,MUIV_PlaneFunc_Abort_Abort])
  1420.     ELSE
  1421.         doMethodA(gad,[msg.method])
  1422.     ENDIF
  1423. ENDPROC
  1424.  
  1425. PROC projectList_memory(cl:PTR TO iclass,obj:PTR TO object)
  1426. DEF win:PTR TO object,data:PTR TO projectList_data
  1427.     data:=INST_DATA(cl,obj)
  1428.  
  1429.     StringF(screentitle,'\s - \d Chip - \d Fast - \d Total',PICVERSION,AvailMem(MEMF_CHIP),AvailMem(MEMF_FAST),AvailMem(MEMF_ANY))
  1430.     get(obj,MUIA_WindowObject,{win})
  1431.     set(win,MUIA_Window_ScreenTitle,screentitle)
  1432.     set(messages_win,MUIA_Window_ScreenTitle,screentitle)
  1433. ENDPROC
  1434.  
  1435. PROC projectList_newitem(cl:PTR TO iclass,obj:PTR TO object/*,msg:PTR TO msg*/)
  1436. DEF window, pfunc,vscroll,hscroll,pid,
  1437. name:PTR TO CHAR,node:PTR TO project_Node,inlist:PTR TO CHAR,
  1438. exec_list:PTR TO lh,data:PTR TO projectList_data,
  1439. pdata:PTR TO planeFunc_data
  1440.  
  1441.     data:=INST_DATA(cl,obj);exec_list:=data.exec_list
  1442.     NEW node
  1443.     window:=WindowObject,
  1444.         MUIA_Window_ScreenTitle, PICVERSION,
  1445.         ->MUIA_Window_UseRightBorderScroller,MUI_TRUE,
  1446.         MUIA_Window_UseBottomBorderScroller,MUI_TRUE,
  1447.         WindowContents,
  1448.             HGroup,
  1449.                 MUIA_Group_Spacing,0,
  1450.                 Child, pfunc:=PlaneFuncObject,End,
  1451.                 Child, vscroll:=ScrollbarObject,
  1452.                     MUIA_FixWidth,20,
  1453.                     ->MUIA_Prop_UseWinBorder,MUIV_Prop_UseWinBorder_Right, /*This is an MUI bug, the refreshing is not done correctely when having a scroller in the right border..*/
  1454.                     MUIA_Prop_Entries,255,MUIA_Prop_Visible,255,
  1455.                 End,
  1456.                 Child, hscroll:=PropObject,
  1457.                     MUIA_Prop_UseWinBorder,MUIV_Prop_UseWinBorder_Bottom,
  1458.                     MUIA_Prop_Entries,255,MUIA_Prop_Visible,255,
  1459.                 End,
  1460.             End,
  1461.         End
  1462.  
  1463.     set(vscroll,MUIA_Prop_Entries,255) -> entries not set correctely..
  1464.  
  1465.     doMethodA(app,[OM_ADDMEMBER,window])  /* now the project window is ready;*/
  1466.     get(pfunc,MUIA_PlaneFunc_Name,{name}) /* the PlaneFunc class has also initialised.*/
  1467.     set(window,MUIA_Window_Title,name) -> Read the default PlaneFunc name
  1468.     pdata:=INST_DATA(cl_planefunc.mcc_class,pfunc)
  1469.     pdata.hscroll:=hscroll
  1470.     pdata.vscroll:=vscroll
  1471.     doMethodA(hscroll,[MUIM_Notify,MUIA_Prop_First,MUIV_EveryTime,pfunc,3,MUIM_Set,MUIA_PlaneFunc_Left,MUIV_TriggerValue])
  1472.     doMethodA(vscroll,[MUIM_Notify,MUIA_Prop_First,MUIV_EveryTime,pfunc,3,MUIM_Set,MUIA_PlaneFunc_Top,MUIV_TriggerValue])
  1473.     doMethodA(window,[MUIM_Notify,MUIA_Window_CloseRequest,MUI_TRUE,pfunc,1,MUIM_PlaneFunc_Close])
  1474.     node.window:=window
  1475.     node.ln.name:=name
  1476.     node.ln.type:=PROJECTNODE_ID
  1477.     node.ln.pri:=0
  1478.     inlist:=String(40)
  1479.     node.item:=inlist
  1480.     get(pfunc,MUIA_PlaneFunc_ProjectID,{pid})
  1481.     node.pid:=pid
  1482.     AddTail(exec_list,node)
  1483.  
  1484.     set(pfunc,MUIA_PlaneFunc_ProjectNode,node)
  1485.  
  1486.     StringF(inlist,'\d :\s',lastid-1,name)
  1487.     doMethodA(obj,[MUIM_List_InsertSingle,inlist,MUIV_List_Insert_Bottom])
  1488.     set(window,MUIA_Window_Open,MUI_TRUE) -> Open the window when everything is finished
  1489.     set(obj,MUIA_List_Active,MUIV_List_Active_Bottom)
  1490.     doMethodA(obj,[MUIM_ProjectList_Memory]) -> Update memory display when opening a project
  1491. ENDPROC
  1492.  
  1493. PROC projectList_notify(cl:PTR TO iclass,obj:PTR TO object,msg:PTR TO args_notify)
  1494. DEF data:PTR TO projectList_data,gadid,z,gad,value,pid,node:PTR TO project_Node
  1495.     data:=INST_DATA(cl,obj)
  1496.     gad:=getcurrent(data,obj)
  1497.     value:=msg.value
  1498.     gadid:=msg.gadget
  1499.     SELECT gadid
  1500.     CASE MUIV_ProjectList_Notify_Name
  1501.         set(gad,MUIA_PlaneFunc_Name,value)
  1502.         get(gad,MUIA_PlaneFunc_State,{z})
  1503.         IF (z=MUIV_PlaneFunc_State_Drawing) OR (value=MUIV_PlaneFunc_State_Loading)
  1504.             z:=33
  1505.         ELSE
  1506.             z:=32
  1507.         ENDIF
  1508.         get(gad,MUIA_PlaneFunc_ProjectID,{pid})
  1509.         get(gad,MUIA_PlaneFunc_ProjectNode,{node})
  1510.         StringF(node.item,'\d\c:\s',pid,z,value)
  1511.         doMethodA(obj,[MUIM_List_Redraw,MUIV_List_Redraw_Active])
  1512.     CASE MUIV_ProjectList_Notify_Type
  1513.         SELECT value
  1514.         CASE 0
  1515.             set(gad,MUIA_PlaneFunc_Type,MUIV_PlaneFunc_Type_DTPic)
  1516.         CASE 1
  1517.             set(gad,MUIA_PlaneFunc_Type,MUIV_PlaneFunc_Type_Graph)
  1518.         ENDSELECT
  1519.     CASE MUIV_ProjectList_Notify_ImageFile
  1520.         set(gad,MUIA_PlaneFunc_ImageFile,value)
  1521.     CASE MUIV_ProjectList_Notify_LoadM
  1522.         SELECT value
  1523.         CASE 0
  1524.             set(gad,MUIA_PlaneFunc_LoadM,MUIV_PlaneFunc_LoadM_Scale)
  1525.         CASE 1
  1526.             set(gad,MUIA_PlaneFunc_LoadM,MUIV_PlaneFunc_LoadM_CutTile)
  1527.         CASE 2
  1528.             set(gad,MUIA_PlaneFunc_LoadM,MUIV_PlaneFunc_LoadM_ChangeSize)
  1529.         ENDSELECT
  1530.     CASE MUIV_ProjectList_Notify_Red
  1531.         set(gad,MUIA_PlaneFunc_Rstr,value)
  1532.     CASE MUIV_ProjectList_Notify_Green
  1533.         set(gad,MUIA_PlaneFunc_Gstr,value)
  1534.     CASE MUIV_ProjectList_Notify_Blue
  1535.         set(gad,MUIA_PlaneFunc_Bstr,value)
  1536. /*    CASE MUIV_ProjectList_Notify_CompileR
  1537.         set(gad,MUIA_PlaneFunc_CompileR,value)
  1538.     CASE MUIV_ProjectList_Notify_CompileG
  1539.         set(gad,MUIA_PlaneFunc_CompileG,value)
  1540.     CASE MUIV_ProjectList_Notify_CompileB
  1541.         set(gad,MUIA_PlaneFunc_CompileB,value)
  1542. */    CASE MUIV_ProjectList_Notify_OutputR
  1543.         set(gad,MUIA_PlaneFunc_OutputR,value)
  1544.     CASE MUIV_ProjectList_Notify_OutputG
  1545.         set(gad,MUIA_PlaneFunc_OutputG,value)
  1546.     CASE MUIV_ProjectList_Notify_OutputB
  1547.         set(gad,MUIA_PlaneFunc_OutputB,value)
  1548.     CASE MUIV_ProjectList_Notify_Width
  1549.         set(gad,MUIA_PlaneFunc_Width,Val(value))
  1550.     CASE MUIV_ProjectList_Notify_Height
  1551.         set(gad,MUIA_PlaneFunc_Height,Val(value))
  1552.     ENDSELECT
  1553. ENDPROC
  1554.  
  1555. PROC projectList_prefs(msg:PTR TO args_prefs) -> a future version may require semaphore, but not for now.
  1556.     msg.var[]:=msg.value
  1557. ENDPROC
  1558.  
  1559. /*This method reads all attributes of the current class and writes the state of the gadgets
  1560. in the settings window*/
  1561. PROC projectList_refresh(cl:PTR TO iclass,obj:PTR TO object,msg:PTR TO args_refresh)
  1562. DEF data:PTR TO projectList_data,nm:PTR TO CHAR,gad,value,q[11]:STRING,pid,win
  1563. DEF exec_list:PTR TO lh,worknode:PTR TO project_Node, count=0,ogad
  1564.  
  1565.     IF quiet=TRUE THEN RETURN
  1566.     data:=INST_DATA(cl,obj)
  1567.     gad,win:=getcurrent(data,obj)
  1568.     IF gad=NIL
  1569.         set(sgroup,MUIA_Disabled,MUI_TRUE)
  1570.         currid:=-1
  1571.         RETURN
  1572.     ENDIF
  1573.     set(sgroup,MUIA_Disabled,FALSE)
  1574.     get(gad,MUIA_PlaneFunc_ProjectID,{pid})
  1575.     IF pid <> currid /*was currid and will be pid*/
  1576.         IF currid > -1
  1577.             ogad:=getp(data,currid)
  1578.             doMethodA(ogad,[MUIM_PlaneFunc_SetTaskPri,rp])
  1579.         ENDIF
  1580.         doMethodA(gad,[MUIM_PlaneFunc_SetTaskPri,cp])
  1581.     ENDIF
  1582.  
  1583.     currid:=pid
  1584.     IF msg.ostate=FALSE
  1585.         doMethodA(gad,[MUIM_PlaneFunc_Lamps])
  1586.         StringF(q,'r(\d,x,y)=',pid)
  1587.         set(r_lbl,MUIA_Text_Contents,q)
  1588.         StringF(q,'g(\d,x,y)=',pid)
  1589.         set(g_lbl,MUIA_Text_Contents,q)
  1590.         StringF(q,'b(\d,x,y)=',pid)
  1591.         set(b_lbl,MUIA_Text_Contents,q)
  1592.         get(gad,MUIA_PlaneFunc_Name,{value})
  1593.         nnset(name_str,MUIA_String_Contents,value)   /*nnset to avoid triggering useless notification*/
  1594.         get(gad,MUIA_PlaneFunc_Type,{value})
  1595.         SELECT value
  1596.         CASE MUIV_PlaneFunc_Type_DTPic
  1597.             nnset(type_reg,MUIA_Group_ActivePage,0)
  1598.         CASE MUIV_PlaneFunc_Type_Graph
  1599.             nnset(type_reg,MUIA_Group_ActivePage,1)
  1600.         ENDSELECT
  1601.  
  1602.         get(gad,MUIA_PlaneFunc_LoadM,{value})  /* these are for image-projects*/
  1603.         SELECT value                           
  1604.         CASE MUIV_PlaneFunc_LoadM_Scale        /* but all settings are updated, so that */   
  1605.             nnset(size_rad,MUIA_Radio_Active,0)/* the user may change the selected page and*/
  1606.         CASE MUIV_PlaneFunc_LoadM_CutTile      /*see the current settings..*/                
  1607.             nnset(size_rad,MUIA_Radio_Active,1)
  1608.         CASE MUIV_PlaneFunc_LoadM_ChangeSize
  1609.             nnset(size_rad,MUIA_Radio_Active,2)
  1610.         ENDSELECT
  1611.         get(gad,MUIA_PlaneFunc_ImageFile,{value})
  1612.         nnset(path_str,MUIA_String_Contents,value)
  1613.  
  1614.         get(gad,MUIA_PlaneFunc_Rstr,{value})   /*these are for function-projects*/
  1615.         nnset(red_str,MUIA_String_Contents,value)
  1616.         get(gad,MUIA_PlaneFunc_Gstr,{value})
  1617.         nnset(green_str,MUIA_String_Contents,value)
  1618.         get(gad,MUIA_PlaneFunc_Bstr,{value})
  1619.         nnset(blue_str,MUIA_String_Contents,value)
  1620.         get(gad,MUIA_PlaneFunc_OutputR,{value})
  1621.         nnset(outr_cyc,MUIA_Cycle_Active,value)
  1622.         get(gad,MUIA_PlaneFunc_OutputG,{value})
  1623.         nnset(outg_cyc,MUIA_Cycle_Active,value)
  1624.         get(gad,MUIA_PlaneFunc_OutputB,{value})
  1625.         nnset(outb_cyc,MUIA_Cycle_Active,value)
  1626. /*        get(gad,MUIA_PlaneFunc_CompileR,{value})
  1627.         nnset(comr_cyc,MUIA_Cycle_Active,value)
  1628.         get(gad,MUIA_PlaneFunc_CompileG,{value})
  1629.         nnset(comg_cyc,MUIA_Cycle_Active,value)
  1630.         get(gad,MUIA_PlaneFunc_CompileB,{value})
  1631.         nnset(comb_cyc,MUIA_Cycle_Active,value)
  1632. */
  1633.  
  1634.         get(gad,MUIA_PlaneFunc_Width,{value})
  1635.         nnset(width_str,MUIA_String_Integer,value)
  1636.         get(gad,MUIA_PlaneFunc_Height,{value})
  1637.         nnset(height_str,MUIA_String_Integer,value)
  1638.         get(win,MUIA_Window_Open,{value})
  1639.         nnset(showme_cyc,MUIA_Cycle_Active,value)
  1640.     ENDIF
  1641.     IF (msg.ostate = FALSE) OR (msg.ostate-2=pid)
  1642.         setlamp(gad)
  1643.     ENDIF
  1644.     IF msg.ostate > 0
  1645.         pid:=msg.ostate-2
  1646.         gad:=getp(data,pid)
  1647.         get(gad,MUIA_PlaneFunc_Name,{nm})
  1648.         get(gad,MUIA_PlaneFunc_State,{value})
  1649.         IF (value=MUIV_PlaneFunc_State_Drawing) OR (value=MUIV_PlaneFunc_State_Loading)
  1650.             value:=33
  1651.         ELSE
  1652.             value:=32
  1653.         ENDIF
  1654.  
  1655.         exec_list:=data.exec_list
  1656.         worknode:=exec_list.head
  1657.         WHILE worknode.pid <> pid
  1658.             count++
  1659.             worknode:=worknode.ln.succ
  1660.         ENDWHILE
  1661.  
  1662.         StringF(worknode.item,'\d\c:\s',pid,value,nm)
  1663.         doMethodA(obj,[MUIM_List_Redraw,count])
  1664.     ENDIF
  1665. ENDPROC
  1666.  
  1667. PROC setlamp(gad:PTR TO object)
  1668. DEF value
  1669.     get(gad,MUIA_PlaneFunc_State,{value})
  1670.     SELECT value
  1671.     CASE MUIV_PlaneFunc_State_Idle
  1672.         set(state_txt,MUIA_Text_Contents,cat.msgs_Idle.getstr())
  1673.         set(lamp_lmp,MUIA_Lamp_Color,MUIV_Lamp_Color_Off)
  1674.         set(state_gau,MUIA_Gauge_Current,0)
  1675.         set(draw_btn,MUIA_Text_Contents,cat.msgl_Render.getstr())
  1676.     CASE MUIV_PlaneFunc_State_Drawing
  1677.         set(state_txt,MUIA_Text_Contents,cat.msgs_Drawing.getstr())
  1678.         set(lamp_lmp,MUIA_Lamp_Color,MUIV_Lamp_Color_Processing)
  1679.         get(gad,MUIA_PlaneFunc_Percent,{value})
  1680.         set(state_gau,MUIA_Gauge_Current,value)
  1681.         set(draw_btn,MUIA_Text_Contents,cat.msgl_Pause.getstr())
  1682.     CASE MUIV_PlaneFunc_State_Loading
  1683.         set(state_txt,MUIA_Text_Contents,cat.msgs_Loading.getstr())
  1684.         set(lamp_lmp,MUIA_Lamp_Color,MUIV_Lamp_Color_LoadingData)
  1685.         get(gad,MUIA_PlaneFunc_Percent,{value})
  1686.         set(state_gau,MUIA_Gauge_Current,value)
  1687.         set(draw_btn,MUIA_Text_Contents,cat.msgl_Pause.getstr())
  1688.     CASE MUIV_PlaneFunc_State_Paused
  1689.         set(state_txt,MUIA_Text_Contents,cat.msgs_Paused.getstr())
  1690.         set(lamp_lmp,MUIA_Lamp_Color,MUIV_Lamp_Color_Ok)
  1691.         get(gad,MUIA_PlaneFunc_Percent,{value})
  1692.         set(state_gau,MUIA_Gauge_Current,value)
  1693.         set(draw_btn,MUIA_Text_Contents,cat.msgl_Restart.getstr())
  1694.     CASE MUIV_PlaneFunc_State_Frozen
  1695.         set(state_txt,MUIA_Text_Contents,cat.msgs_Frozen.getstr())
  1696.         set(lamp_lmp,MUIA_Lamp_Color,MUIV_Lamp_Color_SendingData)
  1697.         set(state_gau,MUIA_Gauge_Current,0)
  1698.         set(draw_btn,MUIA_Text_Contents,cat.msgl_Render.getstr())
  1699.     ENDSELECT
  1700. ENDPROC
  1701.  
  1702. PROC projectList_setpri(cl:PTR TO iclass,obj:PTR TO object,msg:PTR TO args_setpri)
  1703. DEF data:PTR TO projectList_data,task,
  1704. gad
  1705. DEF worknode:PTR TO project_Node, nextnode,exec_list:PTR TO lh,list:PTR TO mlh,cs:PTR TO object,z
  1706.     data:=INST_DATA(cl,obj)
  1707.     task:=msg.task
  1708.     SELECT task
  1709.     CASE MUIV_ProjectList_SetPri_Main
  1710.         SetTaskPri(FindTask(0),msg.value)
  1711.     CASE MUIV_ProjectList_SetPri_Render
  1712.         rp:=msg.value
  1713.  
  1714.         exec_list:=data.exec_list
  1715.         worknode:=exec_list.head  -> First node
  1716.         IF worknode
  1717.             WHILE nextnode:=worknode.ln.succ
  1718.                 IF worknode.pid <> currid
  1719.                     get(worknode.window,MUIA_Window_RootObject,{z})
  1720.                     get(z,MUIA_Group_ChildList,{list})
  1721.                     cs:=list.head
  1722.                     gad:=NextObject({cs})
  1723.                     doMethodA(gad,[MUIM_PlaneFunc_SetTaskPri,rp])
  1724.                 ENDIF
  1725.                 worknode:=nextnode
  1726.             ENDWHILE
  1727.         ENDIF
  1728.  
  1729.     CASE MUIV_ProjectList_SetPri_Curr
  1730.         cp:=msg.value
  1731.         gad:=getcurrent(data,obj)
  1732.         IF gad
  1733.             doMethodA(gad,[MUIM_PlaneFunc_SetTaskPri,cp])
  1734.         ENDIF
  1735.     ENDSELECT
  1736. ENDPROC
  1737.  
  1738. PROC projectList_showme(cl:PTR TO iclass,obj:PTR TO object,msg:PTR TO args_showme)
  1739. DEF win,data:PTR TO projectList_data
  1740. DEF exec_list:PTR TO lh,active,worknode:PTR TO project_Node,z->,qe[30]:STRING
  1741.  
  1742.     data:=INST_DATA(cl,obj)
  1743.  
  1744.     exec_list:=data.exec_list
  1745.     get(obj,MUIA_List_Active,{active})
  1746.     /*get item number "active" of the exec_list (isn't any faster way to do it?)*/
  1747.     worknode:=exec_list.head
  1748.               /* I should add here a check that the bound of the list is never reached!*/
  1749.     IF active > 0
  1750.         FOR z:=1 TO active DO worknode:=worknode.ln.succ
  1751.     ENDIF -> now worknode is the node of the wanted project
  1752.     win:=worknode.window
  1753.     set(win,MUIA_Window_Open,msg.value)
  1754.     /*StringF(qe,'set(\d,MUIA_Window_Open,\d)',win,msg.value)
  1755.     message(active,qe)*/
  1756. ENDPROC
  1757.  
  1758. /***************************************************************
  1759. ** custom uSlider private subclass of Slider class            **
  1760. ****************************************************************
  1761. *                                                              *
  1762. *Simple sub-class of Slider, overriding MUIM_Numeric_Stringify *
  1763. *                                                              *
  1764. ***************************************************************/
  1765. PROC uslider_dispatcher(cl:PTR TO iclass,obj:PTR TO object,msg:PTR TO muip_numeric_stringify)
  1766. DEF data:PTR TO uslider_data,methodid
  1767.     methodid:=msg.methodid
  1768.     SELECT methodid
  1769.     CASE OM_NEW;RETURN uslider_new(cl,obj,msg)
  1770.     CASE MUIM_Numeric_Stringify
  1771.         data:=INST_DATA(cl,obj)
  1772.         IF data.stringify=MUI_TRUE
  1773.             IF msg.value = 0
  1774.                 StrCopy(data.buffer,cat.msgp_guNone.getstr())
  1775.             ELSEIF msg.value=1
  1776.                 StringF(data.buffer,'\d \s',msg.value,cat.msgp_Pixel.getstr())
  1777.             ELSE
  1778.                 StringF(data.buffer,'\d \s',msg.value,cat.msgp_Pixels.getstr())
  1779.             ENDIF
  1780.             RETURN data.buffer
  1781.         ENDIF
  1782.     CASE MUIM_uSlider_Bigger;RETURN uslider_bigger(obj,msg)
  1783.     CASE MUIM_uSlider_Smaller;RETURN uslider_smaller(obj,msg)
  1784.     CASE MUIM_Cleanup
  1785.         data:=INST_DATA(cl,obj)
  1786.         IF data.stringify THEN
  1787.             DisposeLink(data.buffer)
  1788.     ENDSELECT
  1789. ENDPROC doSuperMethodA(cl,obj,msg)
  1790.  
  1791. PROC uslider_new(cl:PTR TO iclass,obj:PTR TO object,msg:PTR TO opset)
  1792. DEF data:PTR TO uslider_data,
  1793.     tags:PTR TO tagitem,
  1794.     tag:PTR TO tagitem
  1795.  
  1796.     IF (obj:=doSuperMethodA(cl,obj,msg))=NIL THEN RETURN 0
  1797.  
  1798.     data:=INST_DATA(cl,obj)
  1799.     tags:=msg.attrlist
  1800.     WHILE tag:=NextTagItem({tags})
  1801.         IF tag.tag=MUIA_uSlider_Stringify
  1802.             data.stringify:=tag.data
  1803.             data.buffer:=String(10)
  1804.         ENDIF
  1805.     ENDWHILE
  1806. ENDPROC obj
  1807.  
  1808. PROC uslider_bigger(obj:PTR TO object,msg:PTR TO args_compare)
  1809. DEF level
  1810.     get(obj,MUIA_Slider_Level,{level})
  1811.     IF level < msg.than THEN
  1812.         nnset(obj,MUIA_Slider_Level,msg.than)
  1813. ENDPROC
  1814.  
  1815. PROC uslider_smaller(obj:PTR TO object,msg:PTR TO args_compare)
  1816. DEF level
  1817.     get(obj,MUIA_Slider_Level,{level})
  1818.     IF level > msg.than THEN
  1819.         nnset(obj,MUIA_Slider_Level,msg.than)
  1820. ENDPROC
  1821.  
  1822. /***************************************************************
  1823. ** sizetxt class                                              **
  1824. ****************************************************************
  1825. *  textobject containing the size of the last loaded picture.  *
  1826. ***************************************************************/
  1827.  
  1828. OBJECT sizetxt_data
  1829.     buffer:PTR TO CHAR
  1830. ENDOBJECT
  1831.  
  1832. CONST MUIM_SizeTxt_Update=$FCB93800
  1833.  
  1834. OBJECT muip_stupd
  1835.     methodid
  1836.     width,height,depth
  1837.     projectid
  1838. ENDOBJECT
  1839.  
  1840. PROC sizetxt_dispatcher(cl:PTR TO iclass,obj:PTR TO object,msg:PTR TO msg)
  1841. DEF methodid
  1842.     methodid:=msg.methodid
  1843.     SELECT methodid
  1844.     CASE OM_NEW;RETURN sizetxt_new(cl,obj,msg)
  1845.     CASE OM_DISPOSE;RETURN sizetxt_dispose(cl,obj,msg)
  1846.     CASE MUIM_SizeTxt_Update;RETURN sizetxt_update(cl,obj,msg)
  1847.     ENDSELECT
  1848. ENDPROC doSuperMethodA(cl,obj,msg)
  1849.  
  1850. PROC sizetxt_new(cl:PTR TO iclass,obj:PTR TO object,msg:PTR TO msg)
  1851. DEF data:PTR TO sizetxt_data
  1852.     obj:=doSuperMethodA(cl,obj,msg)
  1853.     data:=INST_DATA(cl,obj)
  1854.     data.buffer:=String(50)
  1855. ENDPROC obj
  1856.  
  1857. PROC sizetxt_dispose(cl:PTR TO iclass,obj:PTR TO object,msg:PTR TO msg)
  1858. DEF data:PTR TO sizetxt_data
  1859.     data:=INST_DATA(cl,obj)
  1860.     DisposeLink(data.buffer)
  1861. ENDPROC doSuperMethodA(cl,obj,msg)
  1862.  
  1863. PROC sizetxt_update(cl:PTR TO iclass,obj:PTR TO object,msg:PTR TO muip_stupd)
  1864. DEF data:PTR TO sizetxt_data
  1865.     data:=INST_DATA(cl,obj)
  1866.     IF msg.projectid = currid
  1867.         StringF(data.buffer,'\s\d×\d×\d',cat.msgl_PicSize.getstr(),msg.width,msg.height,msg.depth)
  1868.         set(obj,MUIA_Text_Contents,data.buffer)
  1869.     ENDIF
  1870. ENDPROC
  1871.  
  1872. PROC myapp_dispatcher(cl:PTR TO iclass,obj:PTR TO object,msg:PTR TO muip_application_returnid)
  1873.     IF msg.methodid=MUIM_Application_ReturnID
  1874.         IF msg.retid=MUIV_Application_ReturnID_Quit THEN /*separate IFs to avoid illegal memory access, if the message hasn't any argument*/
  1875.             doMethodA(opened_lst,[MUIM_ProjectList_Exit]) -> This will cause the Exit method to be executed right before
  1876.     ENDIF                                           -> ReturnId (when called with Exit returnid)
  1877. ENDPROC doSuperMethodA(cl,obj,msg)
  1878.  
  1879. /***************************************************************
  1880. ** Functions for easy and secure spawning/killing of subtasks **
  1881. ***************************************************************/
  1882.  
  1883. PROC sendsubtaskmsg(st:PTR TO subtask,command,params)
  1884.     st.st_Message.stm_Message.replyport:= st.st_Reply
  1885.     st.st_Message.stm_Message.length   := SIZEOF subtaskmsg
  1886.     st.st_Message.stm_Command          := command
  1887.     st.st_Message.stm_Parameter        := params
  1888.     st.st_Message.stm_Result           := 0
  1889.  
  1890.     PutMsg(IF command=STC_STARTUP THEN st.st_Task::process.msgport ELSE st.st_Port,st.st_Message)
  1891.     WaitPort(st.st_Reply)          /*gets the reply*/
  1892.     GetMsg(st.st_Reply)
  1893. ENDPROC (st.st_Message.stm_Result)
  1894.  
  1895. PROC spawnsubtask(name,func,data:PTR TO planeFunc_data)
  1896.     DEF st=NIL:PTR TO subtask
  1897.  
  1898.     IF (st:=AllocVec(SIZEOF subtask,MEMF_PUBLIC OR MEMF_CLEAR))
  1899.         st.st_Reply:=CreateMsgPort()
  1900.         IF (st.st_Reply)
  1901.             st.st_Data:=data
  1902.             st.st_Task:= CreateNewProc([NP_ENTRY,func,
  1903.                                         NP_NAME,name,
  1904.                                         TAG_DONE])
  1905.             IF (st.st_Task)
  1906.                 IF (sendsubtaskmsg(st,STC_STARTUP,st)) THEN RETURN (st)
  1907.             ENDIF
  1908.             DeleteMsgPort(st.st_Reply)
  1909.         ENDIF
  1910.         FreeVec(st)
  1911.     ENDIF
  1912. ENDPROC
  1913.  
  1914. PROC killsubtask(st:PTR TO subtask)
  1915.     sendsubtaskmsg(st,STC_SHUTDOWN,st)
  1916.     DeleteMsgPort(st.st_Reply)
  1917.     FreeVec(st)
  1918. ENDPROC
  1919.  
  1920. /*exitsubtask and initsubtask are called from the subtask*/
  1921. PROC exitsubtask(st:PTR TO subtask,stm:PTR TO subtaskmsg)
  1922.   /*
  1923.   ** We reply after a Forbid() to make sure we're really gone
  1924.   ** when the main task continues.
  1925.   */
  1926.   IF (st.st_Port) THEN DeleteMsgPort(st.st_Port)
  1927.   Forbid()
  1928.   stm.stm_Result:= FALSE
  1929.   ReplyMsg(stm)
  1930. ENDPROC
  1931.  
  1932. PROC initsubtask()
  1933.   DEF me=NIL:PTR TO tc,
  1934.       st=NIL:PTR TO subtask,
  1935.       stm=NIL:PTR TO subtaskmsg
  1936.  
  1937.   me:= FindTask(NIL)
  1938.  
  1939.   /*
  1940.   ** Wait for our startup message from the SpawnSubTask() function.
  1941.   */
  1942.  
  1943.   WaitPort(me::process.msgport)
  1944.   stm:= GetMsg(me::process.msgport)
  1945.   st:= stm.stm_Parameter
  1946.   st.st_Port:=CreateMsgPort()
  1947.   IF (st.st_Port)
  1948.     /*
  1949.     ** Reply startup message, everything ok.
  1950.     ** Note that if the initialization fails, the code falls
  1951.     ** through and replies the startup message with a stm_Result
  1952.     ** of 0 after a Forbid(). This tells SpawnSubTask() that the
  1953.     ** sub task failed to run.
  1954.     */
  1955.     stm.stm_Result:= TRUE
  1956.     ReplyMsg(stm)
  1957.     RETURN (st)
  1958.   ELSE
  1959.     exitsubtask(st,stm)
  1960.     RETURN (NIL)
  1961.   ENDIF
  1962. ENDPROC
  1963.  
  1964. /***************************************************************
  1965. **    Subtask which does all the time-consuming rendering     **
  1966. ***************************************************************/
  1967.  
  1968. PROC renderfunc()
  1969. DEF st=NIL:PTR TO subtask,
  1970.     data=NIL:PTR TO planeFunc_data,
  1971.     running=TRUE,worktodo=FALSE,x,y,
  1972.     stm=NIL:PTR TO subtaskmsg,
  1973.     command,i,
  1974.     red,green,blue,lr:PTR TO longreal,cnt,oldpixel,
  1975.     rf,gf,bf,rc,gc,bc
  1976.  
  1977.     geta4() -> !!!
  1978.  
  1979.     IF (st:= initsubtask())
  1980.         data:= st.st_Data
  1981.         LOOP
  1982.             /*
  1983.             ** after the sub task is up and running, we go into
  1984.             ** a loop and process the messages from the main task.
  1985.             */
  1986.             WHILE (stm:= GetMsg(st.st_Port))
  1987.                 command:=stm.stm_Command
  1988.                 SELECT command
  1989.                 CASE STC_SHUTDOWN
  1990.                     /*
  1991.                     ** This is the shutdown message from KillSubTask().
  1992.                     */
  1993.                     running:= FALSE
  1994.                     IF data.line
  1995.                         END data.line[data.width*(data.rupd+1)]
  1996.                         data.line:=0
  1997.                     ENDIF
  1998.                 CASE STC_START
  1999.                     ObtainSemaphore(data.sema)
  2000.                     data.drawn:=-1
  2001.                     data.calculated:=-1
  2002.                     DateStamp(data.ds)
  2003.                     ReleaseSemaphore(data.sema)
  2004.  
  2005.                     y:=0;cnt:=data.rupd
  2006.                     i:=0
  2007.                     NEW lr
  2008.                     worktodo:= TRUE
  2009.                     rf:=data.rfunc.calculate
  2010.                     gf:=data.gfunc.calculate
  2011.                     bf:=data.bfunc.calculate
  2012.                     rc:=data.rfunc.precalc
  2013.                     gc:=data.gfunc.precalc
  2014.                     bc:=data.bfunc.precalc
  2015.                     /*allocate memory for a block, if necessary (cgx optimisation)*/
  2016.                     IF cybergfxbase THEN
  2017.                         NEW data.line[data.width*(data.rupd+2)]
  2018.  
  2019.                 CASE STC_PAUSE
  2020.                     worktodo:= FALSE
  2021.                 CASE STC_RESTART -> Deactivate pause
  2022.                     worktodo:=TRUE
  2023.                 ENDSELECT
  2024.                 /*
  2025.                 ** If we received a shutdown message, we do not reply it
  2026.                 ** immediately. First, we need to free our resources.
  2027.                 */
  2028.                 IF (running=FALSE) THEN JUMP exit
  2029.                 ReplyMsg(stm.stm_Message)
  2030.             ENDWHILE
  2031.             IF (worktodo)
  2032.                 /* if there is work to do, i.e. if the rendering is not
  2033.                    finished yet, we calculate the next line and draw
  2034.                    it to the offscreen rastport.*/
  2035.                 ObtainSemaphore(data.sema)
  2036.  
  2037.                 IF data.outputr=OUT_Integer      /*red*/
  2038.                     rc(x,y)
  2039.                 ELSEIF data.outputr=OUT_Float32
  2040.                     rc(x!,y!)
  2041.                 ENDIF
  2042.                 IF data.outputg=OUT_Integer      /*green*/
  2043.                     gc(x,y)
  2044.                 ELSEIF data.outputg=OUT_Float32
  2045.                     gc(x!,y!)
  2046.                 ENDIF
  2047.                 IF data.outputb=OUT_Integer      /*blue*/
  2048.                     bc(x,y)
  2049.                 ELSEIF data.outputb=OUT_Float32
  2050.                     bc(x!,y!)
  2051.                 ENDIF
  2052.  
  2053.                 IF data.savepixel
  2054.                     IF cybergfxbase -> calculate here just to avoid testing twice for gfx system (...)
  2055.                         oldpixel:=ReadRGBPixel(data.rp,0,y)
  2056.                     ELSE
  2057.                         oldpixel:=Pi96ReadPixel(data.rp,0,y)
  2058.                     ENDIF
  2059.                 ENDIF
  2060.                 FOR x:=0 TO data.width-1
  2061.                     IF data.outputr=OUT_Integer      /*red*/
  2062.  
  2063.                         red:=rf(x,y)
  2064.                         ->red:=data.rfunc.evaluate(x,y)
  2065.                         red:=modt(red)
  2066.                         red:=Shl(red,16)
  2067.                     ELSEIF data.outputr=OUT_Float32
  2068.                         red:=!rf(x!,y!)!
  2069.                         ->red:=!data.rfunc.evaluate(x,y)!
  2070.                         red:=modt(red)
  2071.                         red:=Shl(red,16)
  2072.                     /*ELSEIF data.outputr=OUT_Float64
  2073.                         rproc(x,y,lr,data.rfunc)
  2074.                         red:=dFix(lr)
  2075.                         red:=modt(red)
  2076.                         red:=Shl(red,16)*/
  2077.                     ELSEIF data.outputr=OUT_OldR
  2078.                         red:=oldpixel AND $FF0000
  2079.                     ELSEIF data.outputr=OUT_OldG
  2080.                         red:=Shl(oldpixel AND $FF00,8)
  2081.                     ELSE /*IF data.outputr=OUT_OldB*/
  2082.                         red:=Shl(oldpixel AND $FF,16)
  2083.                     ENDIF
  2084.                     IF data.outputg=OUT_Integer      /*green*/
  2085.                         green:=gf(x,y)
  2086.                         ->green:=data.gfunc.evaluate(x,y)
  2087.                         green:=modt(green)
  2088.                         green:=Shl(green,8)
  2089.                     ELSEIF data.outputg=OUT_Float32
  2090.                         green:=!gf(x!,y!)!
  2091.                         ->green:=!data.gfunc.evaluate(x,y)!
  2092.                         green:=modt(green)
  2093.                         green:=Shl(green,8)
  2094.                     /*ELSEIF data.outputg=OUT_Float64
  2095.                         gproc(x,y,lr,data.gfunc)
  2096.                         green:=dFix(lr)
  2097.                         green:=modt(green)
  2098.                         green:=Shl(green,8)*/
  2099.                     ELSEIF data.outputg=OUT_OldR
  2100.                         green:=oldpixel AND $FF0000
  2101.                         green:=Shr(green,8)
  2102.                     ELSEIF data.outputg=OUT_OldG
  2103.                         green:=oldpixel AND $FF00
  2104.                     ELSEIF data.outputg=OUT_OldB
  2105.                         green:=oldpixel AND $FF
  2106.                         green:=Shl(green,8)
  2107.                     ELSE /*IF data.outputr=OUT_CopyR*/
  2108.                         green:=Shr(red,8)
  2109.                     ENDIF
  2110.                     IF data.outputb=OUT_Integer      /*blue*/
  2111.                         blue:=bf(x,y)
  2112.                         ->blue:=data.bfunc.evaluate(x,y)
  2113.                         blue:=modt(blue)
  2114.                     ELSEIF data.outputb=OUT_Float32
  2115.                         blue:=!bf(x!,y!)!
  2116.                         ->blue:=!data.bfunc.evaluate(x,y)!
  2117.                         blue:=modt(blue)
  2118.                     /*ELSEIF data.outputb=OUT_Float64
  2119.                         bproc(x,y,lr,data.bfunc)
  2120.                         blue:=dFix(lr)
  2121.                         blue:=modt(blue)*/
  2122.                     ELSEIF data.outputb=OUT_OldR
  2123.                         blue:=Shr(oldpixel,16)
  2124.                     ELSEIF data.outputb=OUT_OldG
  2125.                         blue:=Shr(oldpixel,8) AND $FF
  2126.                         blue:=blue AND $FF
  2127.                     ELSEIF data.outputb=OUT_OldB
  2128.                         blue:=oldpixel AND $FF
  2129.                     ELSEIF data.outputb=OUT_CopyR
  2130.                         blue:=Shr(red,16)
  2131.                     ELSE /*IF data.outputb=OUT_CopyG*/
  2132.                         blue:=Shr(green,8)
  2133.                     ENDIF
  2134.  
  2135.                     IF cybergfxbase
  2136.                         ->WriteRGBPixel(data.rp,x,y,red+green+blue)
  2137.                         data.line[i]:=red+green+blue
  2138.                         i++
  2139.                         IF data.savepixel THEN                    -> mmh, what if x is on the right border?
  2140.                             oldpixel:=ReadRGBPixel(data.rp,x+1,y)
  2141.                     ELSE
  2142.                         Pi96WritePixel(data.rp,x,y,red+green+blue)
  2143.                         IF data.savepixel THEN
  2144.                             oldpixel:=Pi96ReadPixel(data.rp,x+1,y)
  2145.  
  2146.                     ENDIF
  2147.                 ENDFOR
  2148.                 IF pi96base THEN data.calculated:=y -> that block optimisation isn't available for p96 yet...
  2149.                 ReleaseSemaphore(data.sema)
  2150.                 ObtainSemaphore(data.sema)
  2151.                 IF data.rupd
  2152.                     IF cnt=0
  2153.                         IF (data.app)
  2154.                             IF cybergfxbase
  2155.                                 WritePixelArray(data.line,0,0,data.width*4,data.rp,0,data.calculated+1,data.width,data.rupd+1,RECTFMT_ARGB)
  2156.                                 data.calculated:=y
  2157.                                 i:=0
  2158.                             ENDIF
  2159.                             doMethodA(data.app,[MUIM_Application_PushMethod,data.self,1,MUIM_PlaneFunc_Update])
  2160.                         ENDIF
  2161.                         cnt:=data.rupd
  2162.                     ELSE ; cnt--
  2163.                     ENDIF
  2164.                 ENDIF
  2165.                 ReleaseSemaphore(data.sema)
  2166.                 y++
  2167.                 IF (y=data.height)
  2168.                     /* check if we are finished to draw our picture */
  2169.                      worktodo:= FALSE
  2170.                     /*if we're finished, we ask the main task to exit ourselves..*/
  2171.                     IF (data.app)
  2172.                         IF cybergfxbase
  2173.                             WritePixelArray(data.line,0,0,data.width*4,data.rp,0,data.calculated+1,data.width,data.rupd-cnt+1,RECTFMT_ARGB)
  2174.                             data.calculated:=y
  2175.                         ENDIF
  2176.  
  2177.                         doMethodA(data.app,[MUIM_Application_PushMethod,data.self,1,MUIM_PlaneFunc_Update])
  2178.                         doMethodA(data.app,[MUIM_Application_PushMethod,data.self,2,MUIM_PlaneFunc_Abort,MUIV_PlaneFunc_Abort_Finish])
  2179.                     ENDIF
  2180.                 ENDIF
  2181.                 /* Since we are very busy working, we do not Wait() for signals. */
  2182.             ELSE
  2183.                 /* We have nothing to do, just sit quietly and wait for something to happen */
  2184.                 WaitPort(st.st_Port)
  2185.             ENDIF
  2186.         ENDLOOP
  2187.         END lr
  2188. exit:
  2189.         exitsubtask(st,stm)
  2190.     ENDIF
  2191. ENDPROC
  2192.  
  2193. PROC loadpicture()
  2194. DEF pic:PTR TO super_picture,file:PTR TO CHAR,tbmp:PTR TO trueBitmap
  2195. DEF st=NIL:PTR TO subtask,
  2196.     data=NIL:PTR TO planeFunc_data,
  2197.     running=TRUE,worktodo=FALSE,changedone=TRUE,
  2198.     x,y,
  2199.     stm=NIL:PTR TO subtaskmsg,
  2200.     command,i,
  2201.     cnt=0,init=2
  2202.  
  2203.     geta4()
  2204.     IF (st:= initsubtask())
  2205.         data:=st.st_Data
  2206.         LOOP
  2207.             WHILE (stm:= GetMsg(st.st_Port))
  2208.                 command:=stm.stm_Command
  2209.                 SELECT command
  2210.                 CASE STC_SHUTDOWN
  2211.                     running:= FALSE
  2212.                     IF data.line
  2213.                         END data.line[data.width*(data.rupd+1)]
  2214.                         data.line:=0
  2215.                     ENDIF
  2216.                 CASE STC_START
  2217.                     ObtainSemaphore(data.sema)
  2218.                     data.drawn:=-1
  2219.                     data.calculated:=-1
  2220.                     DateStamp(data.ds)
  2221.                     ReleaseSemaphore(data.sema)
  2222.                     worktodo:=TRUE
  2223.                     y:=0;i:=0
  2224.                     /*allocate memory for a block, if necessary (cgx optimisation)*/
  2225.                     IF cybergfxbase THEN
  2226.                         NEW data.line[data.width*(data.rupd+2)]
  2227.                 CASE STC_PAUSE
  2228.                     worktodo:= FALSE
  2229.                 CASE STC_RESTART
  2230.                     worktodo:=TRUE
  2231.                 CASE STC_CHANGEDONE
  2232.                     changedone:=TRUE
  2233.                 ENDSELECT
  2234.                 IF (running=FALSE) THEN JUMP finish
  2235.                 ReplyMsg(stm.stm_Message)
  2236.             ENDWHILE
  2237.             ->IF (running=FALSE) THEN JUMP finish
  2238.             IF worktodo AND changedone
  2239.                 IF init = 2
  2240.                     NEW pic.super_picture(TRUE)
  2241.                     file:=data.imagefile
  2242.                     IF pic.load(file) <> 0  /*And if data.app=NIL ? :-)*/
  2243.                         doMethodA(data.app,[MUIM_Application_PushMethod,data.self,2,MUIM_PlaneFunc_Abort,MUIV_PlaneFunc_Abort_NoLoad])
  2244.                         worktodo:=FALSE
  2245.                     ELSE
  2246.                         ObtainSemaphore(data.sema) /*same as above :-)*/
  2247.                         IF data.loadm=MUIV_PlaneFunc_LoadM_ChangeSize
  2248.                             doMethodA(data.app,[MUIM_Application_PushMethod,data.self,3,
  2249.                                 MUIM_Set,MUIA_PlaneFunc_Quiet,-2])
  2250.                             doMethodA(data.app,[MUIM_Application_PushMethod,data.self,3,
  2251.                                 MUIM_Set,MUIA_PlaneFunc_Width,pic.width()])
  2252.                             doMethodA(data.app,[MUIM_Application_PushMethod,data.self,3,
  2253.                                 MUIM_Set,MUIA_PlaneFunc_Height,pic.height()])
  2254.                             doMethodA(data.app,[MUIM_Application_PushMethod,data.self,3,
  2255.                                 MUIM_Set,MUIA_PlaneFunc_Quiet,FALSE])
  2256.                             changedone:=FALSE
  2257.                         ENDIF
  2258.                         doMethodA(data.app,[MUIM_Application_PushMethod,size_txt,5,MUIM_SizeTxt_Update,
  2259.                             pic.width(),pic.height(),pic.depth(),data.projectid])
  2260.                         ReleaseSemaphore(data.sema)
  2261.                     ENDIF
  2262.                     init:=1
  2263.                 ELSEIF init = 1
  2264.                     IF (tbmp:=pic.trueconv()) = NIL
  2265.                         doMethodA(data.app,[MUIM_Application_PushMethod,data.self,2,MUIM_PlaneFunc_Abort,MUIV_PlaneFunc_Abort_NoLoad])
  2266.                         worktodo:=FALSE
  2267.                     ENDIF
  2268.                     doMethodA(data.app,[MUIM_Application_PushMethod,data.self,3,MUIM_Set,MUIA_PlaneFunc_Loading,FALSE])
  2269.                     init:=0
  2270.                 ELSE
  2271.                     ObtainSemaphore(data.sema)
  2272.                     IF data.loadm=MUIV_PlaneFunc_LoadM_Scale
  2273.                         IF cybergfxbase /*cgx*/
  2274.                             FOR x:=0 TO data.width-1
  2275.                                 ->WriteRGBPixel(data.rp,x,y,tbmp.readPixel(x*pic.width()/data.width,y*pic.height()/data.height))
  2276.                                 data.line[i]:=tbmp.readPixel(x*pic.width()/data.width,y*pic.height()/data.height)
  2277.                                 i++
  2278.                             ENDFOR
  2279.                         ELSE    /*picasso*/
  2280.                             FOR x:=0 TO data.width-1
  2281.                                 Pi96WritePixel(data.rp,x,y,tbmp.readPixel(x*pic.width()/data.width,y*pic.height()/data.height))
  2282.                             ENDFOR
  2283.                             data.calculated:=y
  2284.                         ENDIF
  2285.                     ELSE
  2286.                         IF cybergfxbase /*cgx*/
  2287.                             FOR x:=0 TO data.width-1
  2288.                                 ->WriteRGBPixel(data.rp,x,y,tbmp.readPixel(Mod(x,pic.width()),Mod(y,pic.height())))
  2289.                                 data.line[i]:=tbmp.readPixel(Mod(x,pic.width()),Mod(y,pic.height()))
  2290.                                 i++
  2291.                             ENDFOR
  2292.                         ELSE    /*picasso*/
  2293.                             FOR x:=0 TO data.width-1
  2294.                                 Pi96WritePixel(data.rp,x,y,tbmp.readPixel(Mod(x,pic.width()),Mod(y,pic.height())))
  2295.                             ENDFOR
  2296.                             data.calculated:=y
  2297.                         ENDIF
  2298.                     ENDIF
  2299.                     IF data.rupd
  2300.                         IF cnt=0
  2301.                             IF (data.app)
  2302.                                 IF cybergfxbase
  2303.                                     WritePixelArray(data.line,0,0,data.width*4,data.rp,0,data.calculated+1,data.width,data.rupd+1,RECTFMT_ARGB)
  2304.                                     data.calculated:=y
  2305.                                     i:=0
  2306.                                 ENDIF
  2307.                                 doMethodA(data.app,[MUIM_Application_PushMethod,data.self,1,MUIM_PlaneFunc_Update])
  2308.                             ENDIF
  2309.                             cnt:=data.rupd
  2310.                         ELSE ; cnt--
  2311.                         ENDIF
  2312.                     ENDIF
  2313.  
  2314.                     ReleaseSemaphore(data.sema)
  2315.                     y++
  2316.                     IF (y=data.height)
  2317.                          worktodo:= FALSE
  2318.                         IF (data.app)
  2319.                             IF cybergfxbase
  2320.                                 WritePixelArray(data.line,0,0,data.width*4,data.rp,0,data.calculated+1,data.width,data.rupd-cnt+1,RECTFMT_ARGB)
  2321.                                 data.calculated:=y
  2322.                             ENDIF
  2323.                             doMethodA(data.app,[MUIM_Application_PushMethod,data.self,1,MUIM_PlaneFunc_Update])
  2324.                             doMethodA(data.app,[MUIM_Application_PushMethod,data.self,2,MUIM_PlaneFunc_Abort,MUIV_PlaneFunc_Abort_Finish])
  2325.                         ENDIF
  2326.                     ENDIF
  2327.                 ENDIF
  2328.             ELSE
  2329.                 WaitPort(st.st_Port)
  2330.             ENDIF
  2331.         ENDLOOP
  2332. finish:
  2333.         END pic
  2334.         exitsubtask(st,stm)
  2335.     ENDIF
  2336. ENDPROC
  2337. /********************************
  2338. *   Inter-referencing...        *
  2339. ********************************/
  2340.  
  2341. /*freeze(expression): this will read-lock all used functions.
  2342. returns true if success, or false if failure*/
  2343.  
  2344. PROC freeze(f:PTR TO expression)
  2345. DEF a:PTR TO planeFunc_data,b,c,data:PTR TO projectList_data,obj,lock
  2346. DEF exec_list:PTR TO lh,worknode:PTR TO project_Node
  2347.     IF f.precision > OUT_Float64 THEN RETURN TRUE
  2348.     data:=INST_DATA(cl_projectlist.mcc_class,opened_lst)
  2349.  
  2350.     a,b,c:=f.reference()
  2351.     IF a > 3 -> direct reference to project "a" (a is the data of the object)
  2352.             /* + sub-functions "b" and "c"*/
  2353.         /*checks that a exists, searching it in the projects list*/
  2354.         data:=INST_DATA(cl_projectlist.mcc_class,opened_lst)
  2355.         exec_list:=data.exec_list
  2356.         worknode:=exec_list.head
  2357.         WHILE wcomp(worknode,a)
  2358.             worknode:=worknode.ln.succ
  2359.         ENDWHILE
  2360.         IF worknode.ln.succ = 0 -> a doesn't exist
  2361.             RETURN FALSE
  2362.         ENDIF
  2363.         obj:=a.self
  2364.         get(obj,MUIA_PlaneFunc_Lock,{lock})
  2365.         IF lock = MUIV_PlaneFunc_Lock_Write THEN RETURN FALSE
  2366.         set(obj,MUIA_PlaneFunc_Lock,MUIV_PlaneFunc_Lock_Read)
  2367.         IF freeze(b) = 0
  2368.             set(obj,MUIA_PlaneFunc_Lock,MUIV_PlaneFunc_Lock_NoRead)
  2369.             RETURN FALSE
  2370.         ENDIF
  2371.         IF freeze(c) = 0
  2372.             free(b) -> IF "c" can't be frozen, let's free "b" before returning
  2373.             set(obj,MUIA_PlaneFunc_Lock,MUIV_PlaneFunc_Lock_NoRead)
  2374.             RETURN FALSE
  2375.         ENDIF
  2376.         RETURN TRUE
  2377.     ENDIF
  2378.  
  2379.     SELECT a
  2380.     CASE 2 -> One sub-function : "b"
  2381.         IF freeze(b) = 0 THEN RETURN FALSE
  2382.     CASE 3 -> Two sub functions : "b" and "c"
  2383.         IF freeze(b) = 0 THEN RETURN FALSE
  2384.         IF freeze(c) = 0
  2385.             free(b) -> IF "c" can't be frozen, let's free "b" before returning
  2386.             RETURN FALSE
  2387.         ENDIF
  2388.     ENDSELECT
  2389. ENDPROC TRUE
  2390.  
  2391. PROC wcomp(node:PTR TO project_Node,data)
  2392.     IF node.ln.succ = 0 THEN RETURN FALSE
  2393. ENDPROC (wdata(node.window) <> data)
  2394.  
  2395. PROC wdata(window)
  2396. DEF gad,list:PTR TO mlh,cs:PTR TO object
  2397.     get(window,MUIA_Window_RootObject,{gad})
  2398.     get(gad,MUIA_Group_ChildList,{list})
  2399.     cs:=list.head
  2400. ENDPROC INST_DATA(cl_planefunc.mcc_class,NextObject({cs}))
  2401.  
  2402. /*free(expression): This un read-locks all used functions.
  2403. It assumes that freeze(function) has been executed before and that
  2404. function did not change since*/
  2405.  
  2406. PROC free(f:PTR TO expression)
  2407. DEF a:PTR TO planeFunc_data,b,c,data:PTR TO projectList_data,obj
  2408.  
  2409.     data:=INST_DATA(cl_projectlist.mcc_class,opened_lst)
  2410.  
  2411.     a,b,c:=f.reference()
  2412.     IF a > 3
  2413.         obj:=a.self
  2414.         set(obj,MUIA_PlaneFunc_Lock,MUIV_PlaneFunc_Lock_NoRead)
  2415.         a:=3
  2416.     ENDIF
  2417.     SELECT a
  2418.     CASE 2 -> One sub-expression : "b"
  2419.         free(b)
  2420.     CASE 3 -> Two sub-expressions : "b" and "c"
  2421.         free(b)
  2422.         free(c)
  2423.     ENDSELECT
  2424. ENDPROC
  2425.  
  2426. /***************************************************************
  2427. **                       main program                         **
  2428. ****************************************************************
  2429.  Opens the libraries, creates the user interface structure and
  2430. notifications. The input loop just waits for MUI to say to quit.
  2431. ***************************************************************/
  2432.  
  2433. PROC main() HANDLE
  2434. DEF l
  2435.     storea4()
  2436.     IF (localebase:=OpenLibrary('locale.library',0)) = NIL THEN
  2437.         Raise('locale.library')
  2438.     NEW cat.create()
  2439.     cat.open()
  2440.     IF (utilitybase:=OpenLibrary('utility.library',36))=NIL THEN
  2441.         Raise('utility.library') /*for tag-list parsing*/
  2442.     IF (datatypesbase:=OpenLibrary('datatypes.library',0))=NIL THEN
  2443.         Raise('datatypes.library')
  2444.     muimasterbase:=OpenLibrary(MUIMASTER_NAME,MUIMASTER_VMIN)
  2445.     IF muimasterbase = NIL THEN
  2446.         Raise('muimaster.library')
  2447.     IF (aslbase:=OpenLibrary('asl.library',37))=NIL THEN
  2448.         Raise('asl.library')
  2449.  
  2450.     dInit(TRUE)
  2451.     cl_planefunc:=eMui_CreateCustomClass(NIL,MUIC_Area ,NIL,SIZEOF planeFunc_data,{planeFunc_dispatcher})
  2452.     cl_projectlist:=eMui_CreateCustomClass(NIL,MUIC_List,NIL,SIZEOF projectList_data,{projectList_dispatcher})
  2453.     cl_uslider:=eMui_CreateCustomClass(NIL,MUIC_Slider,NIL,SIZEOF uslider_data,{uslider_dispatcher})
  2454.     cl_sizetxt:=eMui_CreateCustomClass(NIL,MUIC_Text,NIL,SIZEOF sizetxt_data,{sizetxt_dispatcher})
  2455.     cl_myapp:=eMui_CreateCustomClass(NIL,MUIC_Application,NIL,SIZEOF empty_data,{myapp_dispatcher})
  2456.     ftype_registertitles:=[cat.msgl_type_Image.getstr(),cat.msgl_type_Function.getstr(),NIL]
  2457.     size_radiolabels:=[cat.msgl_lm_Scale.getstr(),cat.msgl_lm_CutTile.getstr(),cat.msgl_lm_Change.getstr(),NIL]
  2458.     showme_cyclelabels:=[cat.msgl_Hidden.getstr(),cat.msgl_Shown.getstr(),NIL]
  2459.  
  2460.     FOR app:=0 TO 14 -> app: I did not want to create a var just for that loop :-)
  2461.         messages[app]:=String(100)
  2462.     ENDFOR
  2463.  
  2464.     app:=MyApplicationObject,
  2465.         MUIA_Application_Title, 'picFX',
  2466.         MUIA_Application_Version,FULLVERSION,
  2467.         MUIA_Application_Author, 'Maxime Gamboni',
  2468.         MUIA_Application_Description, cat.msg_Description.getstr(),
  2469.         MUIA_Application_Base,'picFX',
  2470.  
  2471.         SubWindow, settings_win:=WindowObject,
  2472.             MUIA_Window_Title, cat.msgl_Title.getstr(),
  2473.             MUIA_Window_ScreenTitle, PICVERSION,
  2474.             MUIA_Window_ID,"SETT",
  2475.             WindowContents,HGroup,
  2476.                 Child, VGroup,
  2477.                     MUIA_Weight,30,
  2478.                     Child, TextObject,
  2479.                         NoFrame,
  2480.                         MUIA_Text_PreParse,'\ec',
  2481.                         MUIA_Text_Contents,cat.msgl_OpenedProjects.getstr(),
  2482.                     End,
  2483.                     Child, opened_lsv:=ListviewObject,
  2484.                         InputListFrame,
  2485.                         MUIA_Listview_List,opened_lst:=ProjectListObject,End,
  2486.                     End,
  2487.                     Child, new_btn:=SimpleButton(cat.msgl_New.getstr()),
  2488.                     Child, RectangleObject,MUIA_Rectangle_HBar,MUI_TRUE,MUIA_Weight,0,End,
  2489.                     Child, prefs_btn:=TextObject,
  2490.                         ButtonFrame,
  2491.                         MUIA_Background,MUII_ButtonBack,
  2492.                         MUIA_Text_PreParse,'\ec',
  2493.                         MUIA_Text_Contents,cat.msgl_Prefs.getstr(),
  2494.                         MUIA_InputMode,MUIV_InputMode_RelVerify,
  2495.                     End,
  2496.                 End,
  2497.                 Child, RectangleObject,MUIA_Rectangle_VBar,MUI_TRUE,MUIA_Weight,0,End,
  2498.                 Child, sgroup:=VGroup,
  2499.                     MUIA_Disabled,MUI_TRUE, -> No projects are opened at beginning
  2500.                     Child,name_str:= StringObject,MUIA_String_Contents,cat.msg_Unnamed.getstr(),StringFrame,End,
  2501.                     Child, type_reg:=RegisterGroup(ftype_registertitles),
  2502.                         Child, VGroup,
  2503.                             Child, HGroup,
  2504.                                 Child, FreeLabel(cat.msgl_Path.getstr()),
  2505.                                 Child, PopaslObject,
  2506.                                     MUIA_Popstring_Button,PopButton(MUII_PopFile),
  2507.                                     MUIA_Popasl_Type,ASL_FILEREQUEST,
  2508.                                     MUIA_Popstring_String,path_str:=StringObject,
  2509.                                         StringFrame,
  2510.                                         MUIA_String_Contents,cat.msg_Unnamed.getstr(),
  2511.                                     End,
  2512.                                 End,
  2513.                             End,
  2514.                             Child, HGroup,
  2515.                                 Child, size_rad:=RadioObject,
  2516.                                     GroupFrameT(cat.msgl_Size.getstr()),
  2517.                                     MUIA_Radio_Entries,size_radiolabels,
  2518.                                     MUIA_Radio_Active,1,
  2519.                                 End,
  2520.                                 Child, VGroup,
  2521.                                     Child, RectangleObject,End,
  2522.                                     Child, size_txt:=SizeTextObject,
  2523.                                         TextFrame,
  2524.                                         MUIA_Text_PreParse,'\ec',
  2525.                                         MUIA_Text_Contents,cat.msgl_PicSize.getstr(),
  2526.                                     End,
  2527.                                     Child, RectangleObject,End,
  2528.                                 End,
  2529.                             End,
  2530.                         End,
  2531.                         Child, VGroup,
  2532.                             Child, HGroup,
  2533.                                 Child,red_fail:=LampObject,
  2534.                                     MUIA_Lamp_Type,MUIV_Lamp_Type_Big,
  2535.                                     MUIA_Lamp_ColorType,MUIV_Lamp_ColorType_UserDefined,
  2536.                                     MUIA_Lamp_Color,MUIV_Lamp_Color_Ok,
  2537.                                 End,
  2538.                                 Child, r_lbl:=label('r(#,x,y)='),
  2539.                                 Child, red_str:=StringObject,
  2540.                                     StringFrame,
  2541.                                 End,
  2542.                             End,
  2543.                             Child, HGroup,
  2544.                                 Child, Label(cat.msgl_Output.getstr()),
  2545.                                 Child, outr_cyc:=CycleObject,
  2546.                                     MUIA_Cycle_Entries,[cat.msgl_Int32.getstr(),cat.msgl_Float32.getstr(),cat.msgl_Float64.getstr(),
  2547.                                                         cat.msgl_OldR.getstr(),cat.msgl_OldG.getstr(),cat.msgl_OldB.getstr(),NIL],
  2548.                                     MUIA_Cycle_Active,3,
  2549.                                 End,
  2550.                                 Child, RectangleObject,End,
  2551.                             End,
  2552.  
  2553.                             Child, HGroup,
  2554.                                 Child,green_fail:=LampObject,
  2555.                                     MUIA_Lamp_Type,MUIV_Lamp_Type_Big,
  2556.                                     MUIA_Lamp_ColorType,MUIV_Lamp_ColorType_UserDefined,
  2557.                                     MUIA_Lamp_Color,MUIV_Lamp_Color_Ok,
  2558.                                 End,
  2559.                                 Child, g_lbl:=label('g(#,x,y)='),
  2560.                                 Child, green_str:=StringObject,
  2561.                                     StringFrame,
  2562.                                 End,
  2563.                             End,
  2564.                             Child, HGroup,
  2565.                                 Child, Label(cat.msgl_Output.getstr()),
  2566.                                 Child, outg_cyc:=CycleObject,
  2567.                                     MUIA_Cycle_Entries,[cat.msgl_Int32.getstr(),cat.msgl_Float32.getstr(),cat.msgl_Float64.getstr(),
  2568.                                                         cat.msgl_OldR.getstr(),cat.msgl_OldG.getstr(),cat.msgl_OldB.getstr(),
  2569.                                                         cat.msgl_CopyR.getstr(),NIL],
  2570.                                     MUIA_Cycle_Active,3,
  2571.                                 End,
  2572.                                 Child, RectangleObject,End,
  2573.                             End,
  2574.  
  2575.                             Child, HGroup,
  2576.                                 Child,blue_fail:=LampObject,
  2577.                                     MUIA_Lamp_Type,MUIV_Lamp_Type_Big,
  2578.                                     MUIA_Lamp_ColorType,MUIV_Lamp_ColorType_UserDefined,
  2579.                                     MUIA_Lamp_Color,MUIV_Lamp_Color_Ok,
  2580.                                 End,
  2581.                                 Child, b_lbl:=label('b(#,x,y)='),
  2582.                                 Child, blue_str:=StringObject,
  2583.                                     StringFrame,
  2584.                                 End,
  2585.                             End,
  2586.                             Child, HGroup,
  2587.                                 Child, Label(cat.msgl_Output.getstr()),
  2588.                                 Child, outb_cyc:=CycleObject,
  2589.                                     MUIA_Cycle_Entries,[cat.msgl_Int32.getstr(),cat.msgl_Float32.getstr(),cat.msgl_Float64.getstr(),
  2590.                                                         cat.msgl_OldR.getstr(),cat.msgl_OldG.getstr(),cat.msgl_OldB.getstr(),
  2591.                                                         cat.msgl_CopyR.getstr(),cat.msgl_CopyG.getstr(),NIL],
  2592.                                     MUIA_Cycle_Active,3,
  2593.                                 End,
  2594.                                 Child, RectangleObject,End,
  2595.                             End,
  2596.                         End,
  2597.                     End,
  2598.                     Child, HGroup,
  2599.                         Child, TextObject,
  2600.                             MUIA_Text_PreParse,'\ec',
  2601.                             MUIA_Text_Contents,cat.msgl_Width.getstr(),
  2602.                         End,
  2603.                         Child, TextObject,
  2604.                             MUIA_Text_PreParse,'\ec',
  2605.                             MUIA_Text_Contents,cat.msgl_Height.getstr(),
  2606.                         End,
  2607.                     End,
  2608.                     Child, HGroup,
  2609.                         Child, width_str:=StringObject,
  2610.                             StringFrame,
  2611.                             MUIA_String_Accept,'0123456789',
  2612.                         End,
  2613.                         Child, height_str:=StringObject,
  2614.                             StringFrame,
  2615.                             MUIA_String_Accept,'0123456789',
  2616.                         End,
  2617.                     End,
  2618.                     Child, GroupObject,MUIA_Group_Rows,2,
  2619.                         Child, draw_btn:=TextObject,
  2620.                             ButtonFrame,
  2621.                             MUIA_Background,MUII_ButtonBack,
  2622.                             MUIA_Text_PreParse,'\ec',
  2623.                             MUIA_Text_Contents,cat.msgl_Render.getstr(),
  2624.                             MUIA_InputMode,MUIV_InputMode_RelVerify,
  2625.                         End,
  2626.                         Child, savepic_btn:=SimpleButton(cat.msgl_SavePic.getstr()),
  2627.                         Child, savefunc_btn:=SimpleButton(cat.msgl_SaveFunc.getstr()),
  2628.                         Child, abort_btn:=SimpleButton(cat.msgl_Abort.getstr()),
  2629.                         Child, showme_cyc:=CycleObject,
  2630.                             ButtonFrame,
  2631.                             MUIA_Cycle_Entries,showme_cyclelabels,
  2632.                             MUIA_Cycle_Active,1,
  2633.                         End,
  2634.                         Child, close_btn:=SimpleButton(cat.msgl_Close.getstr()),
  2635.                         Child, loadfunc_btn:=SimpleButton(cat.msgl_LoadFunc.getstr()),
  2636.                         Child, clear_btn:=SimpleButton(cat.msgl_Clear.getstr()),
  2637.                     End,
  2638.                     Child, HGroup,
  2639.                         Child,lamp_lmp:=LampObject,
  2640.                             MUIA_Lamp_Type,MUIV_Lamp_Type_Big,
  2641.                             MUIA_Lamp_ColorType,MUIV_Lamp_ColorType_UserDefined,
  2642.                             MUIA_Lamp_Color,MUIV_Lamp_Color_Off,
  2643.                         End,
  2644.                         Child,state_txt:=TextObject,
  2645.                             MUIA_Text_Contents,cat.msgs_Idle.getstr(),
  2646.                             MUIA_Weight,50,
  2647.                         End,
  2648.                         Child,state_gau:=GaugeObject,
  2649.                             TextFrame,
  2650.                             MUIA_Gauge_Horiz , MUI_TRUE,
  2651.                         End,
  2652.                     End,
  2653.                 End,
  2654.             End,
  2655.         End,
  2656.         SubWindow,prefs_win:=SettingsWindowObject,
  2657.             MUIA_Window_Title,cat.msgl_Prefs.getstr(),
  2658.             MUIA_Window_ID,"PREF",
  2659.             WindowContents,HGroup,
  2660.                 Child, VGroup,
  2661.                     GroupFrameT(cat.msgp_Priority.getstr()),
  2662.                     Child, mainpri_sld:=uSliderObject,
  2663.                         GroupFrameT(cat.msgp_MainTask.getstr()),
  2664.                         MUIA_Slider_Min,-10,
  2665.                         MUIA_Slider_Max,10,
  2666.                         MUIA_Slider_Level,0,
  2667.                     End,
  2668.                     Child, currpri_sld:=uSliderObject,
  2669.                         GroupFrameT(cat.msgp_CurrentTask.getstr()),
  2670.                         MUIA_Slider_Min,-10,
  2671.                         MUIA_Slider_Max,10,
  2672.                         MUIA_Slider_Level,-1,
  2673.                     End,
  2674.                     Child, renderpri_sld:=uSliderObject,
  2675.                         GroupFrameT(cat.msgp_RenderTask.getstr()),
  2676.                         MUIA_Slider_Min,-10,
  2677.                         MUIA_Slider_Max,10,
  2678.                         MUIA_Slider_Level,-2,
  2679.                     End,
  2680.                 End,
  2681.                 Child, VGroup,
  2682.                     Child, renderupdate_sld:=uSliderObject,
  2683.                         GroupFrameT(cat.msgp_RenderUpd.getstr()),
  2684.                         MUIA_uSlider_Stringify,MUI_TRUE,
  2685.                         MUIA_Slider_Min,0,
  2686.                         MUIA_Slider_Max,40,
  2687.                         MUIA_Slider_Level,10,
  2688.                     End,
  2689.                     Child, HGroup,
  2690.                         Child, FreeLabel(cat.msgp_Close.getstr()),
  2691.                         Child, close_cyc:=CycleObject,
  2692.                             MUIA_Cycle_Entries,[cat.msgl_Iconify.getstr(),cat.msgl_Close.getstr(),NIL],
  2693.                             MUIA_Cycle_Active,0,
  2694.                         End,
  2695.                     End,
  2696.                     Child, mui_btn:=SimpleButton(cat.msgp_MuiPrefs.getstr()),
  2697.                 End,
  2698.             End,
  2699.         End,
  2700.         SubWindow,messages_win:=WindowObject,
  2701.             MUIA_Window_Title,cat.msgm_NoMsg.getstr(),
  2702.             MUIA_Window_ID,"MESS",
  2703.             WindowContents,VGroup,
  2704.                 Child,ListviewObject,
  2705.                     MUIA_Listview_Input,FALSE,
  2706.                     ReadListFrame,
  2707.                     MUIA_Listview_List,messages_lst:=ListObject,
  2708.                         MUIA_List_SourceArray,messages,
  2709.                     End,
  2710.                 End,
  2711.                 Child, colour_txt:=TextObject,
  2712.                     TextFrame,
  2713.                     MUIA_Background,MUII_TextBack,
  2714.                     MUIA_Text_Contents,'c(p,x,y)=[r,g,b]',
  2715.                 End,
  2716.             End,
  2717.         End,
  2718.     End
  2719.     IF app <> NIL
  2720.         set(settings_win,MUIA_Window_DefaultObject,opened_lsv) -> This doesn't really work.
  2721.  
  2722.         doMethodA(settings_win,[MUIM_Notify,MUIA_Window_CloseRequest,MUI_TRUE,app,2,MUIM_Application_ReturnID,MUIV_Application_ReturnID_Quit])
  2723.         doMethodA(new_btn,     [MUIM_Notify,MUIA_Pressed,FALSE,opened_lst,1,MUIM_ProjectList_NewItem])
  2724. /*preferences*/
  2725.  
  2726. /*The settingswindow mcc-startup init is really unstable on my system, on some occasions it crashes, else not. So I have put a switch for
  2727. [de-]activating the preferences in picFX. When the noprefs file is present, the preferences will be deactivated and button disabled.
  2728. If noprefs is not present (rename the file), prefs are here as normally.*/
  2729.  
  2730.         IF (l:=Lock('PROGDIR:noprefs',ACCESS_READ)) -> Let's just hope that nobody is writing it right now ;-)
  2731.             set(prefs_btn,MUIA_Disabled,MUI_TRUE)
  2732.             UnLock(l)
  2733.         ELSE
  2734.             doMethodA(prefs_btn,   [MUIM_Notify,MUIA_Pressed,FALSE,prefs_win,3,MUIM_Set,MUIA_Window_Open,MUI_TRUE])
  2735.             doMethodA(mui_btn,     [MUIM_Notify,MUIA_Pressed,FALSE,app,1,MUIM_Application_OpenConfigWindow])
  2736.  
  2737.             doMethodA(prefs_win,   [MUIM_SettingsWindow_Notify,SETID_MainP,  MUIV_EveryTime,opened_lst,3,MUIM_ProjectList_SetPri,MUIV_ProjectList_SetPri_Main,MUIV_TriggerValue])
  2738.             doMethodA(prefs_win,   [MUIM_SettingsWindow_Notify,SETID_RenderP,MUIV_EveryTime,opened_lst,3,MUIM_ProjectList_SetPri,MUIV_ProjectList_SetPri_Render,MUIV_TriggerValue])
  2739.             doMethodA(prefs_win,   [MUIM_SettingsWindow_Notify,SETID_CurrP,  MUIV_EveryTime,opened_lst,3,MUIM_ProjectList_SetPri,MUIV_ProjectList_SetPri_Curr,MUIV_TriggerValue])
  2740.             doMethodA(prefs_win,   [MUIM_SettingsWindow_Notify,SETID_RUpd,   MUIV_EveryTime,opened_lst,3,MUIM_ProjectList_Prefs,{rupd},MUIV_TriggerValue])
  2741.             doMethodA(prefs_win,   [MUIM_SettingsWindow_Notify,SETID_Close,  MUIV_EveryTime,app,3,MUIM_WriteLong,MUIV_TriggerValue,{wclose}])
  2742.             doMethodA(prefs_win,[MUIM_SettingsWindow_Init,
  2743.                 mainpri_sld,     MUIA_Slider_Level,SWIT_STANDARD,0,SETID_MainP,
  2744.                 renderpri_sld,   MUIA_Slider_Level,SWIT_STANDARD,0,SETID_RenderP,
  2745.                 currpri_sld,     MUIA_Slider_Level,SWIT_STANDARD,0,SETID_CurrP,
  2746.                 renderupdate_sld,MUIA_Slider_Level,SWIT_STANDARD,0,SETID_RUpd,
  2747.                 close_cyc,       MUIA_Cycle_Active,SWIT_STANDARD,0,SETID_Close,
  2748.                 NIL])
  2749.         ENDIF
  2750. /*mainpri >= currpri >= renderpri*/
  2751.         doMethodA(mainpri_sld,[MUIM_Notify,MUIA_Slider_Level,MUIV_EveryTime,currpri_sld,2,MUIM_uSlider_Smaller,MUIV_TriggerValue])
  2752.         doMethodA(mainpri_sld,[MUIM_Notify,MUIA_Slider_Level,MUIV_EveryTime,renderpri_sld,2,MUIM_uSlider_Smaller,MUIV_TriggerValue])
  2753.  
  2754.         doMethodA(currpri_sld,[MUIM_Notify,MUIA_Slider_Level,MUIV_EveryTime,renderpri_sld,2,MUIM_uSlider_Smaller,MUIV_TriggerValue])
  2755.         doMethodA(currpri_sld,[MUIM_Notify,MUIA_Slider_Level,MUIV_EveryTime,mainpri_sld,2,MUIM_uSlider_Bigger,MUIV_TriggerValue])
  2756.  
  2757.         doMethodA(renderpri_sld,[MUIM_Notify,MUIA_Slider_Level,MUIV_EveryTime,mainpri_sld,2,MUIM_uSlider_Bigger,MUIV_TriggerValue])
  2758.         doMethodA(renderpri_sld,[MUIM_Notify,MUIA_Slider_Level,MUIV_EveryTime,currpri_sld,2,MUIM_uSlider_Bigger,MUIV_TriggerValue])
  2759.  
  2760. /*Every change to a gadget is sent to the ProjectList class*/
  2761.         doMethodA(name_str,    [MUIM_Notify,MUIA_String_Contents,MUIV_EveryTime,opened_lst,3,MUIM_ProjectList_Notify,MUIV_ProjectList_Notify_Name,MUIV_TriggerValue])
  2762.         doMethodA(type_reg,    [MUIM_Notify,MUIA_Group_ActivePage,MUIV_EveryTime,opened_lst,3,MUIM_ProjectList_Notify,MUIV_ProjectList_Notify_Type,MUIV_TriggerValue])
  2763.         doMethodA(path_str,    [MUIM_Notify,MUIA_String_Contents,MUIV_EveryTime,opened_lst,3,MUIM_ProjectList_Notify,MUIV_ProjectList_Notify_ImageFile,MUIV_TriggerValue])
  2764.         doMethodA(size_rad,    [MUIM_Notify,MUIA_Radio_Active,MUIV_EveryTime,opened_lst,3,MUIM_ProjectList_Notify,MUIV_ProjectList_Notify_LoadM,MUIV_TriggerValue])
  2765.         doMethodA(red_str,     [MUIM_Notify,MUIA_String_Acknowledge,MUIV_EveryTime,opened_lst,3,MUIM_ProjectList_Notify,MUIV_ProjectList_Notify_Red,MUIV_TriggerValue])
  2766.         doMethodA(green_str,   [MUIM_Notify,MUIA_String_Acknowledge,MUIV_EveryTime,opened_lst,3,MUIM_ProjectList_Notify,MUIV_ProjectList_Notify_Green,MUIV_TriggerValue])
  2767.         doMethodA(blue_str,    [MUIM_Notify,MUIA_String_Acknowledge,MUIV_EveryTime,opened_lst,3,MUIM_ProjectList_Notify,MUIV_ProjectList_Notify_Blue,MUIV_TriggerValue])
  2768.         doMethodA(outr_cyc,    [MUIM_Notify,MUIA_Cycle_Active,MUIV_EveryTime,opened_lst,3,MUIM_ProjectList_Notify,MUIV_ProjectList_Notify_OutputR,MUIV_TriggerValue])
  2769.         doMethodA(outg_cyc,    [MUIM_Notify,MUIA_Cycle_Active,MUIV_EveryTime,opened_lst,3,MUIM_ProjectList_Notify,MUIV_ProjectList_Notify_OutputG,MUIV_TriggerValue])
  2770.         doMethodA(outb_cyc,    [MUIM_Notify,MUIA_Cycle_Active,MUIV_EveryTime,opened_lst,3,MUIM_ProjectList_Notify,MUIV_ProjectList_Notify_OutputB,MUIV_TriggerValue])
  2771.         doMethodA(width_str,   [MUIM_Notify,MUIA_String_Acknowledge,MUIV_EveryTime,opened_lst,3,MUIM_ProjectList_Notify,MUIV_ProjectList_Notify_Width,MUIV_TriggerValue])
  2772.         doMethodA(height_str,  [MUIM_Notify,MUIA_String_Acknowledge,MUIV_EveryTime,opened_lst,3,MUIM_ProjectList_Notify,MUIV_ProjectList_Notify_Height,MUIV_TriggerValue])
  2773. /*If the active element of the Opened Projects List has changed, the gadgets must be refreshed*/
  2774.         doMethodA(opened_lst,  [MUIM_Notify,MUIA_List_Active,MUIV_EveryTime,opened_lst,1,MUIM_ProjectList_Refresh,0])
  2775. /*Action buttons:ProjectList class will forward those messages to the selected project*/
  2776.         doMethodA(draw_btn,    [MUIM_Notify,MUIA_Pressed,FALSE,opened_lst,2,MUIM_ProjectList_Forward,MUIM_PlaneFunc_Render])
  2777.         doMethodA(savepic_btn, [MUIM_Notify,MUIA_Pressed,FALSE,opened_lst,2,MUIM_ProjectList_Forward,MUIM_PlaneFunc_SavePic])
  2778.         doMethodA(savefunc_btn,[MUIM_Notify,MUIA_Pressed,FALSE,opened_lst,2,MUIM_ProjectList_Forward,MUIM_PlaneFunc_SaveFunc])
  2779.         doMethodA(loadfunc_btn,[MUIM_Notify,MUIA_Pressed,FALSE,opened_lst,2,MUIM_ProjectList_Forward,MUIM_PlaneFunc_LoadFunc])
  2780.         doMethodA(abort_btn,   [MUIM_Notify,MUIA_Pressed,FALSE,opened_lst,2,MUIM_ProjectList_Forward,MUIM_PlaneFunc_Abort])
  2781.         doMethodA(clear_btn,   [MUIM_Notify,MUIA_Pressed,FALSE,opened_lst,2,MUIM_ProjectList_Forward,MUIM_PlaneFunc_Clear])
  2782. /*since the address of the current project is variable I can't do direct notification. Instead, there are two methods for ProjectList.*/
  2783.         doMethodA(opened_lsv,  [MUIM_Notify,MUIA_Listview_DoubleClick,MUI_TRUE,showme_cyc,3,MUIM_Set,MUIA_Cycle_Active,1])
  2784.         doMethodA(showme_cyc,  [MUIM_Notify,MUIA_Cycle_Active,MUIV_EveryTime,opened_lst,2,MUIM_ProjectList_ShowMe,MUIV_TriggerValue])
  2785.         doMethodA(close_btn,   [MUIM_Notify,MUIA_Pressed,FALSE,opened_lst,1,MUIM_ProjectList_DelItem])
  2786.  
  2787.         set(settings_win,MUIA_Window_Open,MUI_TRUE)
  2788.         set(messages_win,MUIA_Window_Open,MUI_TRUE)
  2789.  
  2790.         doMethodA(opened_lst,[MUIM_ProjectList_Memory])
  2791.  
  2792.         message(-1,cat.msgm_Welcome.getstr())
  2793.  
  2794.         WHILE Not(doMethodA(app,[MUIM_Application_NewInput,{sigs}]) = MUIV_Application_ReturnID_Quit)
  2795.             IF sigs THEN sigs := Wait(sigs)
  2796.         ENDWHILE
  2797.  
  2798.     ELSE
  2799.         WriteF(cat.msg_NoApp.getstr())
  2800.     ENDIF
  2801. EXCEPT DO
  2802.     IF app THEN Mui_DisposeObject(app)
  2803.     IF cl_planefunc THEN Mui_DeleteCustomClass(cl_planefunc)
  2804.     IF cl_projectlist THEN Mui_DeleteCustomClass(cl_projectlist)
  2805.     IF cl_uslider THEN Mui_DeleteCustomClass(cl_uslider)
  2806.     IF cl_sizetxt THEN Mui_DeleteCustomClass(cl_sizetxt)
  2807.     IF cl_myapp THEN Mui_DeleteCustomClass(cl_myapp)
  2808.     dCleanup()
  2809.     cleanfuncs()
  2810.     IF exception
  2811.         IF localebase
  2812.             WriteF(cat.msg_Nolib.getstr(),exception)
  2813.         ELSE
  2814.             WriteF('Failed to open \s.\n',exception)
  2815.         ENDIF
  2816.     ENDIF
  2817.     IF cybergfxbase  THEN CloseLibrary(cybergfxbase)
  2818.     IF datatypesbase THEN CloseLibrary(datatypesbase)
  2819.     IF muimasterbase THEN CloseLibrary(muimasterbase)
  2820.     IF pi96base      THEN CloseLibrary(pi96base)
  2821.     IF utilitybase   THEN CloseLibrary(utilitybase)
  2822.     cat.close()
  2823.     IF localebase THEN CloseLibrary(localebase)
  2824. ENDPROC                     
  2825.  
  2826. PROC message(id,info:PTR TO CHAR) -> Writes a message in the message-list
  2827. DEF t
  2828.     FOR t:=0 TO 13
  2829.         StrCopy(messages[t],messages[t+1]) -> Warning, the addresses mustn't change!
  2830.     ENDFOR
  2831.     StringF(messages[14],'[\d] \s',id,info)
  2832.     doMethodA(messages_lst,[MUIM_List_Redraw,MUIV_List_Redraw_All])
  2833.     StringF(title,'\d Message\c',counter++,-(counter<>2)*"s")     /*I will have to localize this, too!*/
  2834.     set(messages_win,MUIA_Window_Title,title)
  2835. ENDPROC
  2836.  
  2837. PROC messagefmt(id,info:PTR TO CHAR,arg1=0,arg2=0,arg3=0)
  2838. DEF s[100]:STRING
  2839.     StringF(s,info,arg1,arg2,arg3)
  2840.     message(id,s)
  2841. ENDPROC
  2842.  
  2843. /* geta4.e © Leon Woestenberg */
  2844.  
  2845. PROC storea4()
  2846.   LEA a4storage(PC),A0
  2847.   MOVE.L A4,(A0)
  2848. ENDPROC
  2849.  
  2850. PROC geta4()
  2851.   LEA a4storage(PC),A0
  2852.   MOVE.L (A0),A4
  2853. ENDPROC
  2854.  
  2855. a4storage: LONG NIL
  2856.